-
描述
-
现在有"abcdefghijkl”12个字符,将其所有的排列中按字典序排列,给出任意一种排列,说出这个排列在所有的排列中是第几小的?
-
输入
-
第一行有一个整数n(0<n<=10000);
随后有n行,每行是一个排列;
输出
- 输出一个整数m,占一行,m表示排列是第几位; 样例输入
-
3 abcdefghijkl hgebkflacdji gfkedhjblcia
样例输出
-
1 302715242 260726926
-
第一行有一个整数n(0<n<=10000);
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
long fac[13];
int an(const char s[],int n) //求下标为n的字符在子数组中第几大,从0开始数
{
int result = 0,i;
for (i=n+1;i<strlen(s);i++)
if (s[n]>s[i])
result++;
return result;
}
void Factorial() //计算阶乘
{
fac[0] = 1;
int i;
for (i=1;i<13;i++)
fac[i] =fac[i-1]*i;
}
long X(const char s[])//求康托展开的X值
{
long result = 0;
int len = strlen(s);
int i;
for (i=0;i<len;i++)
{
result += an(s,i)*fac[len-i-1];
}
return result;
}
int main()
{
int t;
char str[20];
Factorial();
scanf("%d",&t);
getchar();
while(t--)
{
scanf("%s",str); //用cin会超时
getchar();
printf("%d\n",X(str)+1); //康拓展开是从0下标开始的,故需要+1
}
return 0;
}