POJ 2752

来源:互联网 发布:原油api最新数据 编辑:程序博客网 时间:2024/06/06 08:40

http://poj.org/problem?id=2752

Seek the Name, Seek the Fame
Time Limit: 2000MS Memory Limit: 65536K
Total Submissions: 15797 Accepted: 8020
Description

The little cat is so famous, that many couples tramp over hill and dale to Byteland, and asked the little cat to give names to their newly-born babies. They seek the name, and at the same time seek the fame. In order to escape from such boring job, the innovative little cat works out an easy but fantastic algorithm:

Step1. Connect the father’s name and the mother’s name, to a new string S.
Step2. Find a proper prefix-suffix string of S (which is not only the prefix, but also the suffix of S).

Example: Father=’ala’, Mother=’la’, we have S = ‘ala’+’la’ = ‘alala’. Potential prefix-suffix strings of S are {‘a’, ‘ala’, ‘alala’}. Given the string S, could you help the little cat to write a program to calculate the length of possible prefix-suffix strings of S? (He might thank you by giving your baby a name:)
Input

The input contains a number of test cases. Each test case occupies a single line that contains the string S described above.

Restrictions: Only lowercase letters may appear in the input. 1 <= Length of S <= 400000.
Output

For each test case, output a single line with integer numbers in increasing order, denoting the possible length of the new baby’s name.
Sample Input

ababcababababcabab
aaaaa
Sample Output

2 4 9 18
1 2 3 4 5

这个是考察对于Kmp中next 数组的理解情况的。

大致的题意就是给你个字符串,问他有多少个前缀子串和后缀子串相等,把相等的个数输出。

代码:

#include <stdio.h>#include <iostream>#include <string.h>#include <algorithm>#define N 1000005using namespace std;char s[N];int nexts[N],tmp[N];void get_nexts(char s[],int nexts[]){    int i=0,k=-1,len=strlen(s);    nexts[0]=-1;    while(i<len)    {        if(k==-1||s[i]==s[k])        {            i++,k++;            nexts[i]=k;        }        else            k=nexts[k];    }}int main(){    while(~scanf("%s",s))    {        get_nexts(s,nexts);        int len=strlen(s),i=0;        while(nexts[len])     //这个是非常神奇的代码,nexts[len]表明了整个字符串中最大的前缀后缀子串相等的个数是多少。        {            tmp[i++]=nexts[len];                  len=nexts[len];     //一级一级的扫,整个字符串开始一直扫到没有为止。        }        if(nexts[0]==nexts[len])            printf("1 ");        for(int j=i-1;j>=0;j--)        {            printf("%d ",tmp[j]);        }        printf("%d\n",strlen(s));    //这个有点奇怪的判断,因为前缀子串是不包含整个字符串的,后缀也是不包含的。应该是题的原因。。。。可能我读题不仔细,没有看清类似的注意事项!    }    return 0;}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 微信超出单月支付限额怎么办 行李箱三位数密码忘记了怎么办 手机忘记4位数密码怎么办 win7登入密码忘记了怎么办 电脑登入密码忘记了怎么办 电脑忘记登入密码怎么办 qq钱包支付密码忘了怎么办 财付通转走我卡里的钱怎么办 银行卡资金通过财付通被盗怎么办 社保卡忘了密码怎么办 医保卡忘了密码怎么办 手机qq红包忘记支付密码怎么办 微信红包忘记支付密码怎么办 充点话费充错了怎么办 qq转账记录删除了怎么办 qq转账记录删了怎么办 qq怎么办?q币转给微信 q币送不了别人怎么办 新qq号忘记了怎么办 手机qq登不上去怎么办 qq的账号忘了怎么办 微信红包密码输错锁了怎么办 陌陌钱包异常钱怎么办 对公账户转错了怎么办 微信零钱转账限额怎么办 微信红包充错话费怎么办 qq支付20万限额怎么办 qq红包20万限额怎么办 微信充qb冲错了怎么办 液相色谱柱干了怎么办 微信钱包充流量没到账怎么办 qq买流量不到账怎么办 冲q币电话冲错号了怎么办 下载cf什么文件损坏怎么办 cf老是36_2怎么办啊 永辉超市积分卡怎么办 超市积分卡丢了怎么办 医保卡磁条坏了怎么办 社保卡磁条坏了怎么办 鞋子长了怎么办m.s.cn 厚底皮拖鞋穿松了怎么办