扩展KMP模版
函数:
//计算s1的任意后缀与s2的最长公共前缀,结果存入ex中 void exkmp(char s1[],char s2[],int next1[],int ex[]) { int i,j,p; for(i=0,j=0,p=-1;s1[i]!='\0';i++,j++,p--) { if(p==-1) { j=0; do p++; while(s1[i+p]!='\0'&&s1[i+p]==s2[j+p]); ex[i]=p; } else if(next1[j]<p) { ex[i]=next1[j]; } else if(next1[j]>p) { ex[i]=p; } else { j=0; while(s1[i+p]!='\0'&&s1[i+p]==s2[j+p]) p++; ex[i]=p; } } ex[i]=0; }
使用方法:
next1[0]=0; exkmp(s2+1,s2,next1,next1+1); exkmp(s1,s2,next1,ex);