1. 程式人生 > >2752 【kmp的理解】

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; }