您的位置:首页 > 其它

[POJ 1850] Code

2015-05-01 21:42 316 查看
Code

Time Limit: 1000MSMemory Limit: 30000K
Total Submissions: 8566Accepted: 4069
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

Romania OI 2002

区间计数
前面发了一个用数位DP解的题解,详见/article/6574935.html

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define ll long long
#define N 100010

ll c[27][27];
void Init()
{
memset(c,0,sizeof(c));
c[0][0]=1;
for(int i=1;i<=26;i++)
{
c[i][0]=1;
for(int j=1;j<=i;j++)
{
c[i][j]=c[i-1][j-1]+c[i-1][j];
}
}
}
int main()
{
Init();
char s[12];
int len,flag;
while(scanf("%s",s+1)!=EOF)
{
flag=1;
len=strlen(s+1);
for(int i=1;i<=len;i++)
{
if(s[i-1]>=s[i])
{
flag=0;
break;
}
}
if(!flag)
{
printf("0\n");
continue;
}

ll ans=0;
for(int i=1;i<len;i++) ans+=c[26][i];

for(int i=1;i<=len;i++)
{
char t=(i==1)?'a':s[i-1]+1;
while(t<s[i])
{
ans+=c['z'-t][len-i];
t++;
}
}
printf("%lld\n",ans+1);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: