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.
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.
• 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.
题意:给字符串按字典序进行编号,从1开始,而且合法的字符串是字母按严格的字典序升序组合的字符串。输入字符串输出该字符串的编号,如果是不合法的字符串则输出0。
Sample Input
bf
Sample Output
55
#include <cstdio>
#include <cstring>
using namespace std;
int c[30][30]= {0};
void play_table() //打表,将组合数预处理出来
{
for(int i=0; i<=30; i++)
for(int j=0; j<=i; j++)
if(!j||i==j)
c[i][j]=1;
else
c[i][j]=c[i-1][j]+c[i-1][j-1];
return ;
}
int main()
{
char ss[15];
while(~scanf("%s",ss))
{
int len=strlen(ss),flag=1;
for(int i=1; i<len; i++)
if(ss[i]<=ss[i-1])
{
flag=0;
break;
}
if(!flag) //如果是不合法字符串则直接输出0
{
printf("0\n");
continue;
}
play_table();
int sum=0;
for(int i=1; i<len; i++) //计算长度小于输入字符串长度的个数
sum+=c[26][i];
for(int i=0; i<len; i++) //计算长度等于输入字符串长度且字典序在输入字符串前边的字符串个数
{
char t=i?ss[i-1]+1:'a'; //当前位置可以取的字母
while(t<=ss[i]-1)
{
sum+=c['z'-t][len-i-1]; //'z'-t表示字典序比t大且能放的字母个数,len-i-1表示当前位置后边还未放字母的位数个数
t++;
}
}
printf("%d\n",sum+1); //sum累计的是当前字符串之前有多少个字符串,自身编号当然还要在加1
}
return 0;
}