首页 > 代码库 > 扩展kmp模板
扩展kmp模板
#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<set>#include<vector>#include<queue>#include<map>#include<algorithm>#include<cmath>#include<stdlib.h>#include<time.h>using namespace std;#define mmax 100000+10void extendkmp(char *a,char *b,int m,int n,int *next,int *ret){ int i,j,k; memset(next,0,sizeof(next)); for(j=0;1+j<m&&a[j]==a[1+j];j++); next[1]=j; k=1; for(i=2;i<m;i++){ int len=k+next[k],l=next[i-k]; if(l<len-i){ next[i]=l; } else{ for(j=max(0,len-i);i+j<m&&a[j]==a[i+j];j++); next[i]=j; k=i; } } for(j=0;j<n&&j<m&&a[j]==b[j];j++); ret[0]=j; k=0; for(i=1;i<n;i++){ int len=k+ret[k],l=next[i-k]; if(l<len-i){ next[i]=l; } else{ for(j=max(0,len-i);j<m&&i+j<n&&a[j]==b[i+j];j++); ret[i]=j; k=i; } }}int main(){ char p[mmax],q[mmax]; int next[mmax],ret[mmax]; while(cin>>p>>q){ extendkmp(p,q,strlen(p),strlen(q),next,ret); for(int i=0;i<strlen(q);i++) cout<<ret[i]<<" "; cout<<endl; }}
扩展kmp模板
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。