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题