我排第几个?

来源:互联网 发布:github 知乎 编辑:程序博客网 时间:2024/04/27 21:03

该题的解答用到了:康托展开

我排第几个

时间限制:1000 ms  |  内存限制:65535 KB
难度:3
描述

现在有"abcdefghijkl”12个字符,将其所有的排列中按字典序排列,给出任意一种排列,说出这个排列在所有的排列中是第几小的?

输入
第一行有一个整数n(0<n<=10000);
随后有n行,每行是一个排列;
输出
输出一个整数m,占一行,m表示排列是第几位;
样例输入
3abcdefghijklhgebkflacdjigfkedhjblcia
样例输出
1302715242260726926

代码

 #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;}