Code(组合数学)

Code
Time Limit: 1000MS Memory Limit: 30000K
Total Submissions: 8766 Accepted: 4168

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
大神博客

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <map>
#include <algorithm>
#define INF 0x3f3f3f3f
using namespace std;

typedef long long LL;

const int MAX = 1e5+10;

int Bin[35];

int c[33][33];

char str[20];

char ch;

void ComBinnations()//打表,计算组合数
{
    for(int i=0; i<=32; i++)
    {
        for(int j=0; j<=i; j++)
        {
            if(!j||i==j)
            {
                c[i][j]=1;
            }
            else
            {
                c[i][j]=c[i-1][j]+c[i-1][j-1];
            }
        }
    }
    c[0][0]=0;
}
int main()
{
    int sum;
    bool flag;
    ComBinnations();
    scanf("%s",str);
    int len=strlen(str);
    flag=false;
    for(int i=1; i<len; i++)//判断是否是合法字符
    {
        if(str[i-1]>=str[i])
        {
            printf("0
");
            flag=true;
            break;
        }
    }
    if(!flag)
    {
        sum=0;
        for(int i=1; i<len; i++)//计算比它小的字母排列
        {
            sum+=c[26][i];
        }
        for(int i=0; i<len; i++)//计算长度相等是字符的个数
        {
            ch=!i?'a':str[i-1]+1;
            while(ch<str[i])
            {
                sum+=c['z'-ch][len-i-1];
                ch++;
            }
        }
        printf("%d
",sum+1);//加上本身
    }
    return 0;
}
原文地址:https://www.cnblogs.com/juechen/p/5255963.html