Code
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 |
解:
字典序问题。
详解请看:字典序问题
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
long long c(int n,int m)
{
long long num=1;
for(int i=1;i<=m;i++)
{
num=num*(n-i+1);
num/=i;
}
return num;
}
int main()
{
char a[11];
while(cin>>a)
{
long long sum=1;
int len=strlen(a);
for(int i=1;i<len;i++)
{
if(a[i]<=a[i-1])
{
printf("0\n");
return 0;
}
}
for(int i=1;i<len;i++)
sum+=c(26,i);
int start = 0;
for(int i=0;i<len;i++)
{
for(int z=start;z<a[i]-'a';z++)
{
sum+=c(26-z-1,len-i-1);
}
start=a[i]-'a'+1;
}
printf("%I64d\n",sum);
memset(a,0,sizeof(a));
}
return 0;
}