zoukankan      html  css  js  c++  java
  • 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
    ");
                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;
    }
  • 相关阅读:
    yii2之依赖注入与依赖注入容器
    MySQL查询性能优化
    MySQL索引(2)
    go es
    es数据操作入门
    es环境搭建
    gRPC接入etcd
    etcd简单介绍
    Go调用NSQ简单实践
    NSQ快速入门实践
  • 原文地址:https://www.cnblogs.com/joeylee97/p/6978034.html
Copyright © 2011-2022 走看看