NYOJ139 我排第几个(字符串的解码)
来源:互联网 发布:数据分析发展前景好吗 编辑:程序博客网 时间:2024/04/27 20:34
题目信息:http://acm.nyist.net/JudgeOnline/problem.php?pid=139
现在有"abcdefghijkl”12个字符,将其所有的排列中按字典序排列,给出任意一种排列,说出这个排列在所有的排列中是第几小的?
- 输入
- 第一行有一个整数n(0<n<=10000);
随后有n行,每行是一个排列; - 输出
- 输出一个整数m,占一行,m表示排列是第几位;
- 样例输入
3abcdefghijklhgebkflacdjigfkedhjblcia
- 样例输出
1302715242260726926
题目分析:
本题的家吗问题,在《算法入门经典》中有解答,对于每一个字符s,若在其后有k个字符小于s,则当前的序列的排序会增大k*f[12-i]
。
AC代码:
/** *给出一个字符串,仅由a~l组成,每个出现一次,求给出字符串的字典序大小 *对于每一个字符s,若在其后有k个字符小于s,则当前的序列的排序会增大k*f[12-i] *其中f是每个数的阶乘,i为s的位置,因此只需模拟每一位进行比较即可。 */#include<iostream>#include<cstdio>#include<map>#include<cstring>#include<string>#include<algorithm>#include<queue>#include<vector>#include<stack>#include<cstdlib>#include<cctype>#include<cstring>#include<cmath>using namespace std;int main(){ long long f[15]; f[1]=1; for(int i=2;i<=12;i++){ f[i]=f[i-1]*i; } char s[15]; int t; scanf("%d",&t); while(t--){ scanf("%s",s+1); long long sum=0; for(int i=1;i<=12;i++){ int k=0; for(int j=i+1;j<=12;j++){ if(s[i]>s[j]) k++; } sum+=f[12-i]*k; } printf("%lld\n",sum+1); }return 0;}
0 0
- NYOJ139 我排第几个(字符串的解码)
- NYOJ139 我排第几个
- NYOJ139---我排第几个
- NYOJ139 我排第几个
- NYOJ139我排第几个
- NYOJ139我排第几个(康托展开)
- nyoj139 我排第几个(康拓展开)
- NYOJ139 我排第几个【康托展开】
- NYOJ139 我排第几个(数论,康托展开模板题)
- 我排第几个?
- 我排第几个
- 我排第几个
- 我排第几个
- 我排第几个
- 我排第几个
- 我排第几个
- 我排第几个
- 我排第几个
- FileSystemXmlApplicationContext和ClassPathXmlApplicationContext的区别
- 基于Redis bitmap实现开关配置功能
- 网站SEO优化方案
- sql 把a表的数据插入b表中,where某一个字段相同
- 傲游浏览器
- NYOJ139 我排第几个(字符串的解码)
- 怎样在Eclipse中快速查看各种源代码?
- 24位互联网大咖的人生预言
- vim配置
- 基于Redis bitmap实现签到功能
- MPEG DASH MPD文件字段解释
- Linux/unix哲学--读书笔记
- oracle中查询出A表的结果,并将A表中的数据插入到B表中,对于A表中已经存在的B表数据不在插入
- 程序员编程生产力相差10倍意味着什么?