Seek the Name, Seek the Fame POJ - 2752 (KMP 失配指標陣列)
阿新 • • 發佈:2018-11-06
題意:
給定一個串T,找出串T的子串,該串即既是T的字首也是T的字尾.從小到大輸出所有符合要求的子串的長度.
分析:
把答案就是f[m] f[ f[m] ]...依次下去.理解f陣列的字首字尾思想這道題就迎刃而解了.
#include<bits/stdc++.h> using namespace std; const int maxn = 1e7; char t[maxn],p[maxn]; int f[maxn]; int n,m; void getfail() { f[0]=f[1]=0; for(int i=1;i<m;i++) { int j=f[i]; while(j && p[i]!=p[j])j=f[j]; f[i+1]=p[i]==p[j]?j+1:0; } } int kmp() { getfail(); int j=0; for(int i=0;i<n;i++) { while(j && t[i]!=p[j])j=f[j]; if(t[i]==p[j])j++; if(i==n-1)return j; } } int main() { while(scanf("%s %s",p,t)!=EOF) { n=strlen(t); m=strlen(p); int tmp=kmp(); if(tmp==0) puts("0"); else { for(int i=0;i<tmp;i++) printf("%c",p[i]); printf(" %d\n",tmp); } } }