您的位置:首页 > 其它

POJ 2752

2016-04-07 12:52 218 查看
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 1000005
using namespace std;
char s
;
int nexts
,tmp
;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  kmp poj