【模板】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  
View Code

 

posted @ 2019-08-14 14:38  小布鞋  阅读(125)  评论(0编辑  收藏  举报