nyoj139--我排第几个 (康拓展开)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nyoj139--我排第几个 (康拓展开)相关的知识,希望对你有一定的参考价值。

我排第几个

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

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

输入
第一行有一个整数n(0<n<=10000);
随后有n行,每行是一个排列;
输出
输出一个整数m,占一行,m表示排列是第几位;
样例输入
3
abcdefghijkl
hgebkflacdji
gfkedhjblcia
样例输出
1
302715242
260726926
来源
[苗栋栋]原创
上传者
苗栋栋
懵B;
#include <cstdio>
#include <cstring>
int a[15];
void deal()
{
    a[1]=1; 
    for(int i=2; i<=12; i++)
        a[i]=a[i-1]*i;
}
int main()
{
    deal();
    int t;scanf("%d", &t);
    while(t--)
    {
        char str[15];
        scanf("%s", str); int len=strlen(str);
        int rec =0;
        for(int i=0; i<len; i++)
        {
            int count=0;
            for(int j=i+1; j<len; j++)
                if(str[j]<str[i]) count++;
            rec+= count*a[len-1-i];    
        } 
        printf("%d\\n", rec+1);
    } 
    return 0;
}

 

技术分享
#include <cstdio>
#include <cstring>
int jc[13]={0, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800, 39916800, 479001600};
int main()
{
    char normal[13]="abcdefghijkl"; 
    int t; scanf("%d", &t);
    while(t--)
    {
        int v[13]; memset(v, 0, sizeof(v));
        char str[13]; scanf("%s", str);
        int len=strlen(str); 
        int sum=0;
        
        for(int i=0; i<len; i++)
        {
            v[str[i]-a]=1;    
            if(str[i]-normal[i]==0)
            {
                continue;
            }
            else
            {
                int d=0; int p=str[i]-a;
                for(int k=p-1; k>=0; k--)
                    if(v[k]==0)
                        d++;
                int j=i+1;
                int t=12-j;
                //printf("%d\\n", j+t);
                sum=sum+d*jc[t];
            }        
        }
        printf("%d\\n", sum+1);
    }
    return 0;
}
FALIED

 

以上是关于nyoj139--我排第几个 (康拓展开)的主要内容,如果未能解决你的问题,请参考以下文章

康托展开-全排列应用

LeetCode 60. Permutation Sequence

康拓展开

康拓展开和逆康拓展开

hdoj1043 Eight(逆向BFS+打表+康拓展开)

康拓展开