POJ 1850 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<cstdio> #include<cmath> #include<cstring> #include<sstream> #include<algorithm> #include<queue> #include<deque> #include<iomanip> #include<vector> #include<cmath> #include<map> #include<stack> #include<set> #include<fstream> #include<memory> #include<list> #include<string> using namespace std; typedef long long LL; typedef unsigned long long ULL; #define MAXN 18 #define N 30 #define MOD 1000000 #define INF 1000000009 const double eps = 1e-9; const double PI = acos(-1.0); /* 组合数学 找规律 对于长度为len的字符串C(26,len)个 给定一个字符串首先判断是否是升序的,+计算字符串长度比它小的字符串个数 最后枚举长度和它相等但是顺序在它之前的字符串数目 */ int C[27][27] = { 0 }; void Init()//打组合数表 { for (int i = 0; i <= 26; i++) { for (int j = 0; j <= i; j++) { if (j == 0 || j == i) C[i][j] = 1; else C[i][j] = C[i - 1][j - 1] + C[i - 1][j]; } } C[0][0] = 0; return; } string str; int main() { Init(); cin >> str; int l = str.size(); bool f = false; for (int i = 0; i < l - 1; i++) { if (str[i] >= str[i + 1]) { printf("0\n"); return 0; } } int ans = 0; for (int i = 1; i < l; i++) ans += C[26][i]; for (int i = 0; i < l; i++) { char c = (i == 0) ? 'a' : str[i - 1] + 1; while (c <= str[i] - 1) { ans += C['z' - c][l - 1 - i]; c++; } } cout << ++ans << endl; }