nyoj 139 我排第几个--康拓展开

 

我排第几个

时间限制:1000 ms  |  内存限制:65535 KB
难度:3
 
描述

现在有"abcdefghijkl”12个字符,将其所有的排列中按字典序排列,给出任意一种排列,说出这个排列在所有的排列中是第几小的?

输入
第一行有一个整数n(0<n<=10000);
随后有n行,每行是一个排列;
输出
输出一个整数m,占一行,m表示排列是第几位;
样例输入
3
abcdefghijkl
hgebkflacdji
gfkedhjblcia
样例输出
1
302715242
260726926

代码:

 1 #include "stdio.h"   //nyoj 139 我排第几个--康拓展开
 2 #include "string.h"
 3 
 4 #define N 15
 5 
 6 long long A(int x)  //求阶乘
 7 {
 8     long long ans = 1;
 9     for(int i=1; i<=x; ++i)
10         ans = ans*i;
11     return ans;
12 }
13 
14 int main()
15 {
16     int T;
17     int a[N];
18     int num[N];
19     char str[N];
20     int i,j;
21     scanf("%d",&T);
22     getchar();
23     while(T--)
24     {
25         scanf("%s",str);
26         int len = strlen(str);
27         for(i=0; i<len; ++i)
28         {
29             a[i] = str[i]-'a'+1;
30             num[i] = a[i]-1;
31         }
32         long long ans = 0;
33         for(i=0; i<len; ++i)
34         {
35             ans += num[i]*A(len-i-1);
36             for(j=0; j<len; ++j)
37             {
38                 if(a[j]>a[i])
39                     num[j]--;
40             }
41         }
42         printf("%lld\n",ans+1);
43     }
44     return 0;
45 }

 



 

posted @ 2014-05-03 17:07  ruo_yu  阅读(201)  评论(0编辑  收藏  举报