您的位置:首页 > 其它

poj 1850 Code(同 poj 1496 Word Index)

2014-08-01 10:10 337 查看
Language:
Code

Time Limit: 1000MS Memory Limit: 30000K
Total Submissions: 8022 Accepted: 3767
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

题意很简单,不过自己递推了好久都没推出来。看了别人的题解,有的是DFS有的是DP,不过觉得正确的姿势是组合计数吧。

根据串的长度分别计数:

len    num

1      C(26,1)

2      C(26,2)

3      C(26,3)

...

利用杨辉三角求出组合表C[][]

接下来就是统计了

第一步:统计比当前串长度小的个数

第二步:  统计长度等于当前串且比当前串小的串的个数

第三步:sum值加一,加上当前串。

代码:
<pre class="sh_cpp sh_sourceCode" style="font-family:Courier New,Courier,monospace"><span class="sh_preproc"></span>


#include<stdio.h>

#include<string.h>

char s[10];

int c[30][30];

int main()

{

    for(int i=0;i<=26;i++)

    {

        for(int j=0;j<=i;j++)

        {

            if(!j||j==i)

                c[i][j]=1;

            else

                c[i][j]=c[i-1][j]+c[i-1][j-1];

        }

    }

    c[0][0]=0;

    while(~scanf("%s",s))

    {

        int len=strlen(s);

        int sum=0;

        int ok=1;

        for(int i=1;i<len;i++)

        {

            if(s[i-1]>=s[i])

            {

                ok=0;

                printf("0\n");

                break;

            }

        }

        if(ok)

        {

            sum=0;

            for(int i=1;i<len;i++)

                sum+=c[26][i];

            //printf("%d ",sum);

            for(int i=0;i<len;i++)

            {

                char tmp;

                if(!i)

                    tmp='a';

                else

                    tmp=s[i-1]+1;

                while(tmp<=s[i]-1)

                {

                    sum+=c['z'-tmp][len-i-1];

                    tmp++;

                }

            }

            printf("%d\n",sum+1);

        }

    }

    return 0;

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: