问题描述
现在有”abcdefghijkl”12个字符,将其所有的排列中按字典序排列,给出任意一种排列,说出这个排列在所有的排列中是第几小的?
解决思路
对于一个单词 A1A2A3…An, 对于 A1 ,在字典 [A1:An] 中以 A1 开头的第一个单词的位置是 cnt(A1)∗(n−1)!。其中cnt(A1) 表示在 A2到An 中小于 A1 的个数。 (单词位置从0开始)
那么对于Ai, 在字典 [Ai:An]中以Ai 开头的第一个单词的位置是 cnt(Ai)∗(n−i)! 。其中 cnt(Ai)表示在Ai+1到An 中小于小于 Ai 的个数。
那么单词
A1A2A3…An
在字典中的位置是
ans=∑i=1ncnt(Ai)∗(n−i)!
代码
#include <iostream>
#include <cstdio>
using namespace std;
#define n 12
int fac(int k)
{
int sum = 1;
for (int i = 1; i <= k; i++)
sum *= i;
return sum;
}
int main()
{
int pos = 0;
char a[n];
scanf("%s", a);
for (int i = 0; i < n; i++)
{
int cnt = 0;
for (int j = i; j < n; j++)
{
if (a[i] > a[j])
cnt++;
}
pos += cnt * fac(n-i-1);
}
cout << pos << endl;
return 0;
}