该题的解答用到了:康托展开
我排第几个
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
3
描述
-
现在有"abcdefghijkl”12个字符,将其所有的排列中按字典序排列,给出任意一种排列,说出这个排列在所有的排列中是第几小的?
输入
-
第一行有一个整数n(0<n<=10000);
随后有n行,每行是一个排列;
输出
-
输出一个整数m,占一行,m表示排列是第几位;
样例输入
-
3
abcdefghijkl
hgebkflacdji
gfkedhjblcia
样例输出
-
1
302715242
260726926
该题的解答用到了:康托展开
我排第几个
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
3
现在有"abcdefghijkl”12个字符,将其所有的排列中按字典序排列,给出任意一种排列,说出这个排列在所有的排列中是第几小的?
-
输入
-
第一行有一个整数n(0<n<=10000);
随后有n行,每行是一个排列;
输出
- 输出一个整数m,占一行,m表示排列是第几位; 样例输入
-
3 abcdefghijkl hgebkflacdji gfkedhjblcia
样例输出
-
1 302715242 260726926
代码:
#include <iostream>
#include <string>
#include <math.h>
#include <map>
using namespace std;
int a[15]={0,1},b[15];
void JC()
{
for(int i=2;i<12;i++)
a[i]=a[i-1]*i;
}
int main()
{
JC();
map<char,int> m;
for(int i=0;i<12;i++)
m['a'+i]=i+1;
int n;
cin>>n;
while(n--)
{
string s;
cin>>s;
int sum=1,x,y,i,j,f;
for(j=0;j<=11;j++)//从左向右遍历 ————》康托展开通过这2层for循环实现
{
f=0;
for(int k=0;k<=j;k++)//找之前比目标小的数的个数
{
if(m[s[k]]<m[s[j]])
f++;
}
b[j]=m[s[j]]-1-f;
y=b[j]*a[11-j];
sum+=y;
}
cout<<sum<<endl;
}
return 0;
}