KMP的应用
看到求字符串的的前缀与后缀,首先想到next数组,但是next所求的是同一个字符串中的最大前缀后缀,本题所求的是两个字符串中的最大前缀后缀,那么我们就求出第一个字符串的next数组,在第二个字符串上跑KMP,等到第二个字符串匹配完了以后,第一个字符串匹配到哪里就是所求的答案。
数组大小要注意
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <cmath>
using namespace std;
const int MAXN=50005;
int init(){
int rv=0,fh=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-') fh=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
rv=(rv<<1)+(rv<<3)+c-'0';
c=getchar();
}
return fh*rv;
}
int nxt[MAXN];
char s1[MAXN],s2[MAXN];
void getnxt(){
int len=strlen(s1);
nxt[0]=-1;
int k=-1,j=0;
while(j<len){
if(k==-1||s1[j]==s1[k]) nxt[++j]=++k;
else k=nxt[k];
}
}
int kmp(){
int len1=strlen(s1),len2=strlen(s2);
int i=0,j=0;
while(j<len2){
if(i==-1||s1[i]==s2[j]){
i++;j++;
}else i=nxt[i];
}
return i;
}
int main(){
freopen("in.txt","r",stdin);
while(~scanf("%s %s",s1,s2)){
getnxt();
int ans=kmp();
if(!ans) printf("0
");
else{
for(int i=0;i<ans;i++) printf("%c",s1[i]);
printf(" %d
",ans);
}
}
fclose(stdin);
return 0;
}