排列序数(康托展开)

标题:排列序数

如果用a b c d这4个字母组成一个串,有4!=24种,如果把它们排个序,每个串都对应一个序号:
abcd 0
abdc 1
acbd 2
acdb 3
adbc 4
adcb 5
bacd 6
badc 7
bcad 8
bcda 9
bdac 10
bdca 11
cabd 12
cadb 13
cbad 14
cbda 15
cdab 16
cdba 17

现在有不多于10个两两不同的小写字母,给出它们组成的串,你能求出该串在所有排列中的序号吗?

【输入格式】
一行,一个串。

【输出格式】
一行,一个整数,表示该串在其字母所有排列生成的串中的序号。注意:最小的序号是0。

例如:
输入:
bdca

程序应该输出:
11

再例如:
输入:
cedab

程序应该输出:
70

资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms

康托展开:
X=An*(n-1)!+An-1*(n-2)!+…….+A1*(0)!;
其中An为在当前数组中的排行数(从0开始)

#include
#include
#include
using namespace std;
char str[11];
int jiecheng[11];//用于存放阶乘数
int main()
{
    int len ,paiming,sum=0;
    cin>>str;
    len=strlen(str);
    jiecheng[0]=1;
    for (int i=1;i<11;i++)
    {
        jiecheng[i]=jiecheng[i-1]*i;
    }
    for (int i=0;i0;//找到a[i]的排名
        for (int j=i;jif (str[i]>str[j])
            {
                paiming++;
            }
        }
        sum+=paiming*jiecheng[len-i-1];//康托展开式
    }
    cout<return 0;
}

你可能感兴趣的:(排列序数(康托展开))