[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 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、简单、不过写了好久,囧

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

char s[N];
ll bit[N];
ll dp[N][N];

ll dfs(ll pos,ll mx,bool limit,bool fzero)
{
    if(pos==-1) return 1;
    if(!limit && !fzero && dp[pos][mx]!=-1) return dp[pos][mx];
    ll end=limit?bit[pos]:26;
    ll ans=0;
    for(ll i=fzero?0:mx; i<=end; i++)
    {
        ans+=dfs(pos-1,i+1,limit && i==end,fzero && !i);
    }
    if(!limit && !fzero) dp[pos][mx]=ans;
    return ans;
}
ll cal()
{
    ll len=strlen(s+1);
    for(ll i=1; i<=len; i++)
    {
        bit[len-i]=s[i]-‘a‘+1;
    }
    return dfs(len-1,0,1,1);
}
int main()
{
    memset(dp,-1,sizeof(dp));
    while(scanf("%s",s+1)!=EOF)
    {
        int flag=1;
        int len=strlen(s+1);
        for(int i=1; i<len; i++)
        {
            if(!(s[i]<s[i+1]))
            {
                flag=0;
                break;
            }
        }
        if(!flag) printf("0\n");
        else
            printf("%lld\n",cal()-1);
    }
    return 0;
}
时间: 2024-08-05 05:57:30

[POJ 1850] Code的相关文章

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: 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

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(找规律)

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(组合数学?数位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

[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