您的位置:首页 > 其它

POJ 1850 Code 组合数学

2017-06-10 10:32 274 查看


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<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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: