问题描述
现在有”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;
}