• poj Code(组合数)


    Code
    Time Limit: 1000MS   Memory Limit: 30000K
    Total Submissions: 9918   Accepted: 4749

    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

     
    /*
    组合数
    题意是查一个字串的字典序排名
    先求出长度比它小的,显然是ΣC 26 i(i<len)
    然后求出长度等于它却比它小的。具体看代码。 
    */
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    
    #define N 27
    
    using namespace std;
    int c[N][N],ans;
    char str[N];
    
    inline void combination()
    {
        for(int i=0;i<=26;i++)  
            for(int j=0;j<=i;j++)  
                if(!j || i==j)  
                    c[i][j]=1;  
                else  
                    c[i][j]=c[i-1][j-1]+c[i-1][j];  
        c[0][0]=0;  
        return;  
    }
    
    int main()
    {
        combination();
        while(cin>>str)
        {
            ans=0;
            int len=strlen(str);
            for(int i=1;i<len;i++)
              if(str[i]<=str[i-1])
                {
                    cout<<"0"<<endl;
                    return 0;
                }
            for(int i=1;i<len;i++) ans+=c[26][i];//长度小于它的所有方案 
            for(int i=0;i<len;i++)
            {
                char ch=(!i)?'a':str[i-1]+1;//比上一个大
                while(ch<str[i])//比当前这个小 
                {
                    ans+=c['z'-ch][len-i-1];//长度等于它且排在它前面的所有方案 
                    ch++;
                }
            }
            cout<<++ans<<endl;
        }
        return 0;
    }
    折花枝,恨花枝,准拟花开人共卮,开时人去时。 怕相思,已相思,轮到相思没处辞,眉间露一丝。
  • 相关阅读:
    [NOIP2010]关押罪犯
    图的联通入门题
    【luogu4777】扩展中国剩余定理(EXCRT)[数论 扩展中国剩余定理]
    【luogu3868】【TJOI2009】猜数字[模板] [数论 中国剩余定理]
    【luogu1082】【noip2012】同余方程 [数论 扩展欧几里德]
    【luogu1962】斐波那契数列 [矩阵乘法]
    【uva1644】 素数间隔 Prime Gap [数学 质数筛]
    【uva307】小木棍 Sticks [dfs搜索]
    【luogu4011】孤岛营救问题(拯救大兵瑞恩) [最短路][分层思想]
    【noip2015】
  • 原文地址:https://www.cnblogs.com/L-Memory/p/7423346.html
Copyright © 2020-2023  润新知