您的位置:首页 > 其它

NOY 139 康托展开

2017-12-16 17:34 239 查看

题目链接

NOY 139

我排第几个

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

输入

第一行有一个整数n(0<n<=10000);

随后有n行,每行是一个排列;

输出

输出一个整数m,占一行,m表示排列是第几位;

样例输入

3

abcdefghijkl

hgebkflacdji

gfkedhjblcia

样例输出

1

302715242

260726926

思路

康托展开模版题

代码

#include<iostream>
#include<cstdio>
using namespace std;

int num[13];
void init(){
num[0] = num[1] = 1;
for(int i = 2 ; i<= 12; i++)
num[i] = num[i-1] * i;
}
int cantor(char s[]){
int len = 12, ans = 0;
for(int i = 0; i < 12; i++){
int temp = 0;
for(int j = i+1 ; j< 12; j++)
if(s[i]>s[j])
temp++;
ans += temp * num[12 - 1 - i];
}
return ans + 1;
}
int main()
{
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
char s[20];
int t;
init();
scanf("%d",&t);
while(t--){
scanf("%s",s);
printf("%d\n",cantor(s));
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数论 ACM