标签:
现在有"abcdefghijkl”12个字符,将其所有的排列中按字典序排列,给出任意一种排列,说出这个排列在所有的排列中是第几小的?
3 abcdefghijkl hgebkflacdji gfkedhjblcia
1 302715242 260726926
#include <cstdio> #include <cstring> int a[15]; void deal() { a[1]=1; for(int i=2; i<=12; i++) a[i]=a[i-1]*i; } int main() { deal(); int t;scanf("%d", &t); while(t--) { char str[15]; scanf("%s", str); int len=strlen(str); int rec =0; for(int i=0; i<len; i++) { int count=0; for(int j=i+1; j<len; j++) if(str[j]<str[i]) count++; rec+= count*a[len-1-i]; } printf("%d\n", rec+1); } return 0; }
#include <cstdio> #include <cstring> int jc[13]={0, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800, 39916800, 479001600}; int main() { char normal[13]="abcdefghijkl"; int t; scanf("%d", &t); while(t--) { int v[13]; memset(v, 0, sizeof(v)); char str[13]; scanf("%s", str); int len=strlen(str); int sum=0; for(int i=0; i<len; i++) { v[str[i]-‘a‘]=1; if(str[i]-normal[i]==0) { continue; } else { int d=0; int p=str[i]-‘a‘; for(int k=p-1; k>=0; k--) if(v[k]==0) d++; int j=i+1; int t=12-j; //printf("%d\n", j+t); sum=sum+d*jc[t]; } } printf("%d\n", sum+1); } return 0; }
标签:
原文地址:http://www.cnblogs.com/fengshun/p/5352524.html