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
数位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; }