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.
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.
Sample Input
bf
Sample Output
55
Source
组合数学。
代码如下:
#include<iostream>
#include<string.h>
using namespace std;
int c[27][27];
//杨辉三角:
void yanghui_table(void) {
for (int i = 0; i < 27; i++)
for (int j = 0; j <= i; j++)
if (i == j || j == 0)
c[i][j] = 1;
else
c[i][j] = c[i - 1][j - 1] + c[i - 1][j];
c[0][0] = 0;
}
int main(void) {
yanghui_table();
char string[11];
while (cin >> string) {
int sum = 0;
int len = strlen(string);
int flag = 0;
for (int i = 0; i < len - 1; i++)
if (string[i] >= string[i + 1]) {//检查string字符串是否符合升序排列
cout << 0 << endl;
flag = 1;
break;
}
if (flag)
break;
for (int i = 1; i < len; i++)
sum += c[26][i]; //比string字符串长度小的长度为i的符合升序排列的字符串有26ci个
char ch;
for (int i = 0; i < len; i++) {
if (i == 0)//当前位置的字符至少要比前一位置的字符大1
ch = 'a';
else
ch = string[i - 1] + 1;
while (ch < string[i]) {//当前位置的字符至多能比后一位置的字符串小1
sum += c['z' - ch][len - i - 1]; //剩下的字符串中可供选择的有'z'-ch个,每次选择len-i-1个按照升序排列
ch++;
}
}
if (!flag)
cout << ++sum << endl; //输出结果
}
return 0;
}