康托展开

#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<string>
#include<stack>
#include<queue>
#include<map>
#include<cstdlib>
#include<set>
#include<ctime>
#include<vector>
#include<cstdio>
#include<list>
using namespace std;
typedef long long ll;
int INF=2147483647;
int inf=-2147483648;
#define read(x) scanf("%d",&x);
#define fo(i,n) for(int i=1;i<=(n);i++)
#define me(a) memset(a,0,sizeof(a));
#define one(x) cout<<(x)<<endl;
#define two(a,b) cout<<(a)<<" "<<(b)<<endl;
int jiecheng(int r)
{
    int p=1;
    for(int x=r;x>=1;x--)
    {
        p=p*x;
    }
    return p;
}
int a[100005];
int main()
{
    int cnt;
    int ans=1;
    string s;
    me(a);
    cin>>s;
    for(int j=0;j<s.length();j++)
    {
        a[j]=s[j]-'a'+1;
    }
    for(int i=0;i<s.length();i++)
    {
        cnt=0;
        for(int j=i+1;j<s.length();j++)
        {
            if(a[i]>a[j])
            cnt++;
        }
        ans+=(cnt*(jiecheng(s.length()-i-1)));
    }
    one(ans);
    return 0;
}
原文地址:https://www.cnblogs.com/wangmenghan/p/5841666.html