字典序问题
找到其中的递推关系即可。
#include"iostream" #include"stdio.h" #include"string" #include"string.h" using namespace std; const int mx=105; char str[mx]; long long cnt[mx][mx]; long long tot[mx]; int main() { freopen("E:\\in.txt","r",stdin); int t,i,j,k; memset(tot,0,sizeof(tot)); memset(cnt,0,sizeof(cnt)); for(i=1;i<=26;i++) cnt[i][1]=1; for(i=1;i<=26;i++) tot[1]+=cnt[i][1]; for(k=2;k<=6;k++) { for(i=1;i<=26;i++) { for(j=i+1;j<=26;j++) { cnt[i][k]+=cnt[j][k-1]; } } } for(k=2;k<=6;k++) { for(i=1;i<=26;i++) { tot[k]+=cnt[i][k]; } } cin>>t; while(t--) { cin>>str; int len=strlen(str); int sum=0; for(i=1;i<len;i++) sum+=tot[i]; for(i=0;i<len;i++) { int t; if(i==0) t=1; else t=str[i-1]-96+1; for(j=t;j<str[i]-96;j++) { sum+=cnt[j][len-i]; } } cout<<sum+1<<endl; } return 0; }