您的位置:首页 > 其它

nyoj-139-我排第几个(康托展开)

2015-04-08 21:52 148 查看

我排第几个

时间限制:1000 ms | 内存限制:65535 KB

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

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

随后有n行,每行是一个排列;输出输出一个整数m,占一行,m表示排列是第几位;样例输入
3
abcdefghijkl
hgebkflacdji
gfkedhjblcia

样例输出
1
302715242
260726926

来源[苗栋栋]原创上传者
苗栋栋

//康托展开
#include <iostream>
#include<string>
using namespace std;
const int N = 12;
long long a
 = { 0, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880,
		3628800, 39916800 };//0-12的阶乘
long long Cantor(string s) {
	int i, j, count;
	long long res = 1;
	for (i = 0; i < N; ++i) {
		count = 0;
		for (j = i + 1; j < N; ++j)
			if (s[i] > s[j])//如果前面一个大于后面
				++count;
		res = res + count * a[N - i - 1];<span id="transmark"></span>
	}
	return res;
}
int main() {
	int n;
	cin>>n;
	while(n--){
		string a;
		cin>>a;
		long long res=Cantor(a);
		cout<<res<<endl;
	}
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: