POJ 2752 Seek the Name, Seek the Fame(KMP 理解应用)
2013-07-23 16:12
555 查看
Seek the Name, Seek the Fame
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 Source POJ Monthly--2006.01.22,Zeyuan Zhu |
这个题目看见首先这个串就是一个,而且是最长的
然后就是对这个串求一次next求完之后就是输出结果
结果就是输出next[len]这个肯定不是本身最长的,然后不断next next就OK了
至于为什么这样其实理解了KMP是不难发现的
就拿题目中的串来讲解一下吧!
ababcababababcabab
0: -1 1: 0 2: 0 3: 1 4: 2 5: 0 6: 1 7: 2 8: 3 9: 4 10: 3 11: 4 12: 3 13: 4 14: 5 15: 6 16: 7 17: 8 18: 9
看18位置的next是9,那么这个是一个答案,因为在位置18前面有9个字符是满足题目的串
然后跳到9的这个位置,发现就是答案,其实结果已经很明显了
18位置的next是9,那么9位置的next值前面的next值个字符和18前面的几个相同,而又与开始的
几个相同,这样就是后缀与前缀相同,就是题目要求的答案了!
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
char str[500000];
int next[500000];
int ans[500000];
int pos;
int get_next(int i,int j)
{
next[0]=-1;
while(str[i])
{
if(j==-1 || str[i]==str[j])
{
j++;
i++;
next[i]=j;
}
else
j=next[j];
}
return i;
}
int main()
{
int i,j,k;
int len;
while(scanf("%s",str)!=EOF)
{
pos=0;
len=get_next(0,-1);
i=next[len];
while(i!=-1)
{
ans[pos++]=i;
i=next[i];
}
for(i=pos-2;i>=0;i--)
printf("%d ",ans[i]);
printf("%d\n",len);
}
return 0;
}
相关文章推荐
- poj 2752 Seek the Name, Seek the Fame(KMP应用)
- poj 2752 Seek the Name, Seek the Fame(KMP应用)
- poj 2752 Seek the Name, Seek the Fame(KMP应用)
- POJ 2752 Seek the Name, Seek the Fame(KMP,next数组的应用)
- poj 2752 Seek the Name, Seek the Fame(KMP应用)
- POJ-2752 Seek the Name, Seek the Fame(kmp中next数组的应用)
- poj 2752 Seek the Name, Seek the Fame(KMP应用)
- poj 2752 Seek the Name, Seek the Fame(理解KMP的失配函数!) .
- POJ - 2752 Seek the Name, Seek the Fame (KMP的next[]应用)
- POJ 2752 Seek the Name, Seek the Fame(KMP next数组应用)
- poj 2752 Seek the Name, Seek the Fame(KMP应用)
- poj 2752 Seek the Name, Seek the Fame(KMP应用)
- poj 2752 Seek the Name, Seek the Fame(KMP应用)
- poj 2752 Seek the Name, Seek the Fame(KMP应用)
- POJ 2752 Seek the Name,Seek the Fame(KMP应用)
- POJ - 2752 Seek the Name, Seek the Fame(KMP next数组的理解)
- poj 2752 Seek the Name, Seek the Fame(KMP应用)
- poj 2752 Seek the Name, Seek the Fame(KMP应用)
- poj2752_Seek the Name,Seek the Fame_KMP(next数组定义的应用)
- POJ-2752-Seek the Name, Seek the Fame(KMPnext数组应用)