poj1850 http://poj.org/problem?id=1850

注意审题和细节。
//分两步计算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;
}

你可能感兴趣的:(poj1850 http://poj.org/problem?id=1850)