今天是2017/7/8,DCDCBigBig的第二十二篇博文
EXKMP(next+extend)
using namespace std;
int l1,l2,next[100001],extend[100001];
char s[100001],t[100001];
void getnext(){
int a=0,p;
next[0]=l2;
for(int i=1,j=-1;i<l2;i++,j--){
if(j<0||i+next[i-a]>=p){
if(j<0){
p=i;
j=0;
}
while(p<l2&&t[p]==t[j]){
p++;
j++;
}
next[i]=j;
a=i;
}else next[i]=next[i-a];
}
}
void getex(){
int a=0,p;
for(int i=0,j=-1;i<l1;i++,j--){
if(j<0||i+next[i-a]>=p){
if(j<0){
p=i;
j=0;
}
while(p<l1&&s[p]==t[j]){
p++;
j++;
}
extend[i]=j;
a=i;
}else extend[i]=next[i-a];
}
}
int main(){
memset(next,0,sizeof(next));
scanf("%s%s",s,t);
l1=strlen(s);
l2=strlen(t);
getnext();
getex();
for(int i=0;i<l2;i++){
printf("%d ",next[i]);
}
printf("\n");
for(int i=0;i<l1;i++){
printf("%d ",extend[i]);
}
return 0;
}
谈