现在有"abcdefghijkl”12个字符,将其所有的排列中按字典序排列,给出任意一种排列,说出这个排列在所有的排列中是第几小的?
3 abcdefghijkl hgebkflacdji gfkedhjblcia
1 302715242 260726926
思路:之前是用next_permutation做的,超时了。然后看见讨论组里说是康托展开。。之前没看懂,刚才看了一个博客里的链接,说的很好。。
http://zh.wikipedia.org/zh/康托展开
my code:
#include<iostream>
#include<string.h>
using namespace std;
int jiecheng(int n)
{
int i;
int ji=1;
for(i=1;i<=n;i++)
ji=ji*i;
return ji;
}
int main()
{
int T,i,j,len,count,sum;
char a[13];
cin>>T;
while(T--)
{
sum=1;
cin>>a;
len=strlen(a);
for(i=0;i<len;i++)
{
count=0;
for(j=i+1;j<len;j++)
{
if(a[i]>a[j])
{
count++;
}
}
sum=sum+count*jiecheng(len-i-1);
}
cout<<sum<<endl;
}
return 0;
}
原文:http://blog.csdn.net/zuguodexiaoguoabc/article/details/44923999