POJ 1850, Code

Time Limit: 1000MS  Memory Limit: 30000K
Total Submissions: 3153  Accepted: 1414


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


// POJ1850.cpp : Defines the entry point for the console application.
//

#include 
<iostream>
using namespace std;

static int C[30][30];
int main(int argc, char* argv[])
{

    
char word[15];
    scanf(
"%s", word);
    
int len = strlen(word);

    
for (int i = 1; i < len; ++i)
        
if (word[i-1>= word[i])
        {
            cout 
<< 0 << endl;
            
return 0;
        };

    C[
0][0= 1;
    
for (int i = 1; i < 30++i)
        
for (int j = 0; j <= i; ++j)
            C[i][j] 
= (j == 0? C[i-1][j] : C[i-1][j-1+ C[i-1][j];

    unsigned 
long long code = 0;

    
for (int i = 1; i < len; ++i) code += C[26][i];

    
for (int i = 0; i < len; ++i)
    {
        
char c = (i==0? 'a': word[i-1+ 1;
        
for(; c <= word[i] - 1++c)
            code 
+= C['z' - c][len - 1 - i];
    }

    
++code;
    cout 
<< code <<endl;

    
return 0;
}

原文地址:https://www.cnblogs.com/asuran/p/1584249.html