POJ 1850 Code(组合数学)

Code

Time Limit: 1000MS   Memory Limit: 30000K
Total Submissions: 8662   Accepted: 4113

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

      题意:给一个字符串,求这个字符串排第几?换句话说输出某个str字符串在字典中的位置,因为字典是从a=1開始的,因此str的位置值就是
在str前面全部字符串的个数 +1规定输入的字符串必须是升序排列。不降序列是非法字符串

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

using namespace std;

int c[27][27] = {0};

void updata()
{
    for(int i=0;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];
            }
        }
    }
    c[0][0] = 0;
}

int main()
{
    char str[20];
    updata();
    while(scanf("%s",str)!=EOF)
    {
        int len = strlen(str);
        for(int i=0;i<len-1;i++)
        {
            if(str[i]>=str[i+1])
            {
                printf("0\n");
                return 0;
            }
        }
        int sum = 0;
        for(int i=1;i<len;i++)
        {
            sum += c[26][i];
        }
        for(int i=0;i<len;i++)
        {
            char ch = (i)?

str[i-1]+1:‘a‘;
            while(ch<=str[i]-1)
            {
                sum += c[‘z‘-ch][len-1-i];
                ch++;
            }
        }
        sum += 1;
        printf("%d\n",sum);
    }
    return 0;
}
时间: 2024-07-31 14:34:53

POJ 1850 Code(组合数学)的相关文章

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

poj:1850 Code(组合数学?数位dp!)

题目大意:字符的字典序依次递增才是合法的字符串,将字符串依次标号如:a-1 b-2 ... z-26 ab-27 bc-52. 为什么题解都是组合数学的...我觉得数位dp很好写啊(逃 f[pos][pre]前pos位,前一位是pre有几个满足条件的字符串,其实等同于这个字符串的序号是多少 好像数位dp的博客真没什么东西好写的... #include<iostream> #include<cstring> #include<cstdlib> #include<cs

POJ 1850/ 1496 组合数学

POJ 1850/ 1496 组合数学 题目地址: POJ 1496 Word Index POJ 1850 Code 题意: 1. 每个词是自增的 2. 同样长度的词是按字典序排练的 3. 我们把这些词标序 求某个词的序号 分析: 组合数学... 推出公式然后用杨辉三角打表出组合数,具体看http://blog.csdn.net/lyy289065406/article/details/6648492. 我还是太弱Orz... 代码: 1496: /* * Author: illuz <iil

POJ 1850 Code 数位DP

据说又是一道组合数学题,数学不好的我只想出的DP写法 注意如果输入不合法要输出0 #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <map> #include <cstdli

[POJ 1850] Code

Code Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 8539   Accepted: 4048 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

POJ 1850 Code(找规律)

Code Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 7913   Accepted: 3709 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

【POJ 1850】 Code

[POJ 1850] Code 还是非常想说 数位dp真的非常方便! !. 数位dp真的非常方便!.! 数位dp真的非常方便! !! 重要的事说三遍 该题转换规则跟进制差点儿相同 到z时进一位 如az下位为bc 上位必须比下位小 依据这个规则搜出全部情况就可以 #include <iostream> #include <cstdio> #include <cstring> using namespace std; int dp[11][27]; int digit[11

POJ 1496 POJ 1850 组合计数

Code Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 8256 Accepted: 3906 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 t

POJ - 1780 Code (欧拉回路+手写DFS)

Description KEY Inc., the leading company in security hardware, has developed a new kind of safe. To unlock it, you don't need a key but you are required to enter the correct n-digit code on a keypad (as if this were something new!). There are severa