注意审题和细节。
//分两步计算1:第一,算出长度小于所给字符串的所有字符串的个数。
//第二,算出长度等于所给字符串但是排在前面的所有字符串的个数。
//方法,利用斐波那契打表
#include<stdio.h>
#include<string.h>
char cha[20];
int fib[27][27];
void Fib()
{
for(int i=0; i<27; i++)
{
fib[i][0]=1;
fib[i][i]=1;
}
for(int i=2;i<27;i++)
{
for(int j=1;j<i;j++)
{
fib[i][j]=fib[i-1][j-1]+fib[i-1][j];
}
}
}
int main()
{
long long ans;
int len;
char ch;
Fib();
int i;
char j;
int flag;
while(scanf("%s",cha)!=EOF)
{
ans=0;
flag=0;
len=strlen(cha);
for(int i=0;i<len-1;i++)
if(cha[i]>cha[i+1])
{
printf("0\n");
flag=1;
break;
}
if(flag) continue;
for( i=1;i<len;i++)
ans+=fib[26][i];
for( i=0;i<len;i++)//根据题意字符是按照升序排列的
{
ch=i==0?'a':(cha[i-1]+1);
for( j=ch;j<cha[i];j++)
ans+=fib['z'-j][len-1-i];
}
printf("%lld\n",ans+1);//别忘了加它本身啊。
}
return 0;
}