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

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<sstream>
#include<algorithm>
#include<queue>
#include<deque>
#include<iomanip>
#include<vector>
#include<cmath>
#include<map>
#include<stack>
#include<set>
#include<fstream>
#include<memory>
#include<list>
#include<string>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
#define MAXN 18
#define N 30
#define MOD 1000000
#define INF 1000000009
const double eps = 1e-9;
const double PI = acos(-1.0);
/*
组合数学 找规律
对于长度为len的字符串C(26,len)个
给定一个字符串首先判断是否是升序的,+计算字符串长度比它小的字符串个数
最后枚举长度和它相等但是顺序在它之前的字符串数目
*/
int C[27][27] = { 0 };
void Init()//打组合数表
{
    for (int i = 0; i <= 26; i++)
    {
        for (int j = 0; j <= i; j++)
        {
            if (j == 0 || j == i)
                C[i][j] = 1;
            else
                C[i][j] = C[i - 1][j - 1] + C[i - 1][j];
        }
    }
    C[0][0] = 0;
    return;
}
string str;
int main()
{
    Init();
    cin >> str;
    int l = str.size();
    bool f = false;
    for (int i = 0; i < l - 1; i++)
    {
        if (str[i] >= str[i + 1])
        {
            printf("0\n");
            return 0;
        }
    }
    int ans = 0;
    for (int i = 1; i < l; i++)
        ans += C[26][i];
    for (int i = 0; i < l; i++)
    {
        char c = (i == 0) ? ‘a‘ : str[i - 1] + 1;
        while (c <= str[i] - 1)
        {
            ans += C[‘z‘ - c][l - 1 - i];
            c++;
        }
    }
    cout << ++ans << endl;
}
时间: 2024-10-19 02:59:01

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

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

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