Simpsons’ Hidden Talents HDU - 2594
kmp轻改
我的思路是,直接在s1中kmps2
然后,当匹配到s2的最后时,直接return j就可以了
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int max_n = 5e4+100;
char s[max_n],p[max_n];
int net[max_n];
void getnext(){
int n = strlen(p);p[n]=1;net[0]=-1;
for (int i=0,j=-1;i<n;){
if (j==-1||p[i]==p[j]){
++i;++j;
if (p[i]!=p[j])net[i]=j;
else net[i]=net[j];
}else j=net[j];
}p[n]='\0';
}
int kmp(){
int n = strlen(s);int m = strlen(p);
s[n]=1;p[m]=2;
for (int i=0,j=0;i<n;){
if (j==-1||p[j]==s[i])++i,++j;
else j=net[j];
if (i==n)return j;
}s[n]='\0';p[m]='\0';
}
int main(){
while (~scanf("%s\n%s",p,s)){
getnext();
int ans = kmp();
if (ans==0)printf("0\n");
else{
for (int i=0;i<ans;++i)printf("%c",p[i]);
printf(" %d\n",ans);
}
}
}但是似乎还是由更巧妙的方法,
直接getnext(s1+" "+s2)然后return next[2*n+1]就可以了
真的是太妙了,感觉有点类似后缀数组哦
Kuangbin题单详解(kmpManacher) 文章被收录于专栏
刷Kuangbin题

查看20道真题和解析