[POJ 1850] Code

Code

Time Limit: 1000MS   Memory Limit: 30000K
Total Submissions: 8566   Accepted: 4069

Description

Transmitting and memorizing information is a task that requires different coding systems for the best use of the available space. A well known system is that one where a number is associated to a character sequence. It is considered that the words are made only of small characters of the English alphabet a,b,c, ..., z (26 characters). From all these words we consider only those whose letters are in lexigraphical order (each character is smaller than the next character). 
The coding system works like this:  • The words are arranged in the increasing order of their length.  • The words with the same length are arranged in lexicographical order (the order from the dictionary).  • We codify these words by their numbering, starting with a, as follows:  a - 1  b - 2  ...  z - 26  ab - 27  ...  az - 51  bc - 52  ...  vwxyz - 83681  ... 
Specify for a given word if it can be codified according to this coding system. For the affirmative case specify its code. 

Input

The only line contains a word. There are some constraints:  • The word is maximum 10 letters length  • The English alphabet has 26 characters. 

Output

The output will contain the code of the given word, or 0 if the word can not be codified.

Sample Input

bf

Sample Output

55

Source

Romania OI 2002
 
区间计数
前面发了一个用数位DP解的题解,详见http://www.cnblogs.com/hate13/p/4452047.html
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define ll long long
#define N 100010


ll c[27][27];
void Init()
{
    memset(c,0,sizeof(c));
    c[0][0]=1;
    for(int i=1;i<=26;i++)
    {
        c[i][0]=1;
        for(int j=1;j<=i;j++)
        {
            c[i][j]=c[i-1][j-1]+c[i-1][j];
        }
    }
}
int main()
{
    Init();
    char s[12];
    int len,flag;
    while(scanf("%s",s+1)!=EOF)
    {
        flag=1;
        len=strlen(s+1);
        for(int i=1;i<=len;i++)
        {
            if(s[i-1]>=s[i])
            {
                flag=0;
                break;
            }
        }
        if(!flag)
        {
            printf("0\n");
            continue;
        }

        ll ans=0;
        for(int i=1;i<len;i++) ans+=c[26][i];

        for(int i=1;i<=len;i++)
        {
            char t=(i==1)?'a':s[i-1]+1;
            while(t<s[i])
            {
                ans+=c['z'-t][len-i];
                t++;
            }
        }
        printf("%lld\n",ans+1);
    }
    return 0;
}

 

posted @ 2015-05-01 21:42  哈特13  阅读(124)  评论(0编辑  收藏  举报