扩展KMP模板(下标从0开始)
扩展kmp求得是:S,T
entend[i]表示S中i开始的后缀与T最长公共前缀
暂时没用从1下标开始的扩展KMP,下次补坑==
1 void EKMP(char s[],char t[],int lens,int lent) 2 { 3 int i,j,p,l,a; 4 next[0]=lent; j=0; 5 while (j+1<lent&&t[j]==t[j+1]) j++; 6 next[1]=j; 7 a=1; 8 for (i=2;i<lent;i++) 9 { 10 p=next[a]+a-1; 11 l=next[i-a]; 12 if (i+l<p+1) next[i]=l; 13 else{ 14 j=max(0,p-i+1); 15 while (i+j<lent&&t[i+j]==t[j]) j++; 16 next[i]=j; 17 a=i; 18 } 19 } 20 21 j=0; 22 while (j<lens&&j<lent&&s[j]==t[j]) j++; 23 extend[0]=j; a=0; 24 for (i=1;i<lens;i++) 25 { 26 p=extend[a]+a-1; 27 l=next[i-a]; 28 if (l+i<p+1) extend[i]=l; 29 else{ 30 j=max(0,p-i+1); 31 while (i+j<lens&&j<lent&&s[i+j]==t[j]) j++; 32 extend[i]=j; 33 a=i; 34 } 35 } 36 }