【模板】exkmp
哎,打多校题就是查自己算法的缺漏的。。。来学exkmp了,存存模板。
引用:https://www.jianshu.com/p/107e47994d49
感觉就是和kmp差不多,都是先自己匹配自己搞个数组,然后再模式串匹配文本串。
只不过kmp的数组是指i结尾的。
exkmp的extend[ i ] 指的是s串(文本串)中 以i为开始和t串的最长公共前缀。
nex[ i ]指的是t串中 以 i为开始和t串的lcp。
1 void get_nex(char str[]){ 2 int i=0,j,pos,len=strlen(str); 3 nex[0]=len; 4 while(str[i]==str[i+1] && i+1<len) i++; nex[1]=i; 5 pos=1; 6 for(i=2;i<len;i++){ 7 if(nex[i-pos]+i < nex[pos]+pos) nex[i]=nex[i-pos]; 8 else{ 9 j = nex[pos]+pos-i; 10 if(j<0) j=0; 11 while(i+j<len && str[j]==str[j+i]) j++; nex[i]=j; 12 pos=i; 13 } 14 } 15 } 16 17 void exkmp(char s[],char t[]){ 18 int i=0,j,pos,ls=strlen(s),lt=strlen(t); 19 get_nex(t); 20 while(s[i]==t[i] && i<ls && i<lt) i++; 21 extend[0]=i; 22 pos=0; 23 for(i=1;i<ls;i++){ 24 if(nex[i-pos]+i < extend[pos]+pos) extend[i]=nex[i-pos]; 25 else{ 26 j = extend[pos]+pos-i; 27 if(j<0) j=0; 28 while(i+j<ls && j<lt && s[j+i]==t[j]) j++; 29 extend[i]=j; 30 pos=i; 31 } 32 } 33 } 34