首页 > 代码库 > 扩展kmp
扩展kmp
#include<cstdio> #include<cstring> #include<iostream> using namespace std; char s[101],t[101]; int ls,lt; int extend[101],next[101]; void getnext() { int a=0; next[0]=lt; while(a<lt-1&&t[a]==t[a+1]) a++; next[1]=a; a=1; for(int k=2;k<lt;k++) { int p=a+next[a]-1; int l=next[k-a];// if(k-1+l>=p)// { int j=(p-k+1)>0 ? p-k+1 : 0;// while(k+j<lt&&t[k+j]==t[j]) j++; next[k]=j; a=k; } else next[k]=l; } } void exkmp() { int a=0; int minlen=ls<lt ? ls : lt; while(a<minlen&&s[a]==t[a]) a++; extend[0]=a; a=0; for(int k=1;k<ls;k++) { int p=a+extend[a]-1; int l=next[k-a];// if(k-1+l>=p)// { int j=(p-k+1)>0 ? p-k+1 : 0; while(k+j<ls&&j<lt&&s[k+j]==t[j]) j++; extend[k]=j; a=k; } else extend[k]=l; } } int main() { while(cin>>s>>t) { ls=strlen(s); lt=strlen(t); getnext(); exkmp(); int maxn=0,k=-1; for(int i=0;i<ls;i++) printf("%d ",extend[i]); } }
扩展kmp
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。