康托展开

/*
康托展开
给定一个字符串,问这是字典序中的第几小
*/
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int p[15];
void fac()  //求前k项的阶乘
{
    p[0] = 1;
    p[1] = 1;
    for(int i = 2;i < 25; i++)
    {
        p[i] = i * p[i-1];
    }
}
int kangtuo(char *s)  //康托展开
{
    int len = strlen(s);
    int i,j,count,sum = 1;
    for(i = 0 ; i < len ; i++)
    {
        count=0;
        for(j = i + 1 ; j < len ; j++)
        {
            if(s[i] > s[j])
               count++;
        }
        sum += count * p[len-1-i];
    }
    return sum;
}
int main()
{
    int n;
    char a[20];
    fac();
    scanf("%d",&n);
    while(n--)
    {
        scanf("%s",a);
        printf("%d\n",kangtuo(a));
    }
    return 0;
}

你可能感兴趣的:(康托展开)