1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 int c[27][27]; 6 void init()//初始化组合数 7 { 8 int i,j; 9 for(i=0;i<=26;i++) 10 { 11 for(j=0;j<=i;j++) 12 { 13 if(!j||i==j) 14 c[i][j]=1; 15 else 16 c[i][j]=c[i-1][j-1]+c[i-1][j]; 17 } 18 } 19 return; 20 } 21 int main() 22 { 23 init(); 24 char s[17]; 25 int i,j; 26 scanf("%s",s); 27 int len=strlen(s); 28 for(i=1;i<len;i++) 29 { 30 if(s[i-1]>=s[i])//不满足条件 31 { 32 printf("0\n"); 33 return 0; 34 } 35 } 36 int sum=0; 37 for(i=1;i<len;i++)//把前面不等长的加起来 38 { 39 sum+=c[26][i]; 40 } 41 for(i=0;i<len;i++)//这时等长 42 { 43 char ch=(i==0?‘a‘:s[i-1]+1); 44 while(ch<=s[i]-1)//需要枚举相加 45 { 46 sum+=c[‘z‘-ch][len-1-i]; 47 ch++; 48 } 49 } 50 printf("%d\n",sum+1); 51 return 0; 52 }
原文:http://www.cnblogs.com/sdau--codeants/p/3525947.html