Code
Time Limit: 1000MS Memory Limit: 30000K
Total Submissions: 9118 Accepted: 4349
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
题意:给出一个字典,每个字符串有一个编号
输入一个字符串,如果合法,输出其编号,不合法输出0
解:首先用组合数计算比他短的字符串的个数,很好求,这里用递推打表求解,说到这里说一下两种求组合数的方法。
1,递推,用于比较小且数据较多
int c[30][30];
c[i][j]代表在i个中选j个的组合数
int comb()
{
for (int i=1;i<=26;i++)
for (int j=0;j<=i;j++)
{
if (j==0 || i==j)
c[i][j]=1;
else c[i][j]=c[i-1][j-1]+c[i-1][j];
}
}
2,对于较大的组合数,用阶乘公式,小心超界和TLE
好了,回到本题
对于长度和原串相同的字符串,从前到后处理
for (int i=0;i
代码如下:
#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
long long a,b,d,n,m;
int c[30][30];
int comb()
{
for (int i=1;i<=26;i++)
for (int j=0;j<=i;j++)
{
if (j==0 || i==j)
c[i][j]=1;
else c[i][j]=c[i-1][j-1]+c[i-1][j];
}
}
char s[20];int len;
long long ans;
char cc[20];
int main()
{
scanf("%s",s);
comb();
len=strlen(s);
for (int i=1;i<len;i++)
if (s[i]<s[i-1])
{
cout<<0<<endl;
return 0;
}
ans=0;
for (int i=1;i<len;i++)
ans+=c[26][i];
for (int i=0;i<len;i++)
{
for (char j=(!i)?'a':s[i-1]+1;j<s[i];j++)
{
ans+=c['z'-j][len-i-1];
}
}
cout<<++ans<<endl;
}