扩展KMP
参考资料https://segmentfault.com/a/1190000008663857
扩展KMP主要通过next数组以及extend数组,在模式串中找到所有与匹配串中完全匹配的段。
关于扩展KMP的思路,网上博客遍地开花,这里只是简单的记录一下模板。
void getnext(int next[],string t) { int t_len=t.size(); int next[0]=t_len; int a; int p; for(int i=1;j=-1;i<t_len;i++.j--) { if(j==-1 || i+next[i-a]>=p) { if(j<0) p=i,j=0; while(p<t_len && t[p]==t[j]) { p++; j++; } next[i]=j; a=i; } else next[i]=next[i-a]; } } void getextend(string s,string t,int extend[],int next[]) { getnext(next,t); int a; int p; int s_len=s.size(); int t_len=t.size(); for(int i=1,j=-1;i<s_len;i++,j--) { if(j==-1 || i+next[i-1]>=p) { if(j==-1) p=i,j=0; while(p<s_len && s[i]==t[j]) { p++; j++; } extend[i]=j; a=i; } else extend[i]=extend[i-a]; } }