POJ - 2752 【kmp的理解】
题目大意是 给你一个字符串,让你找出这个字符串中所有即是前缀又是后缀的字串的长度
很显然,这个字符串本身就是我们要找的字符串
我们很快可以发现,我们需要找的字符串一定是该字符串的相同的最长前缀和最长后缀的字串
比如说
ababcababababcabab
满足条件的子串有 ababcabab abab ab
这样我们可以联想到KMP中的next的求法【如果不知道可以去看KMP算法入门】,那么我们可以先求最大的串的Next,再去找我们找的的子串的Next 如果子串的Next与末尾相同,那么该子串即我们所求的子串
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn=4e6+50;
char str[maxn];
int Next[maxn];
void getNext()
{
int i=0;
int j=-1;
Next[0]=-1;
int len=strlen(str);
while(i<len)
{
if(j==-1||str[i]==str[j])Next[++i]=++j;
else j=Next[j];
}
}
vector<int>k;
int main()
{
while(scanf("%s",str)!=EOF)
{
k.clear();
getNext();
int len=strlen(str);
k.push_back(len);
for(int i=Next[len-1];i!=-1;i=Next[i])
{
if(str[i]==str[len-1])
k.push_back(i+1);
}
for(int i=k.size()-1;i>=0;i--)
{
if(i!=0)
printf("%d ",k[i]);
else printf("%d\n",k[i]);
}
}
return 0;
}