KMP算法的实现
标签(空格分隔): ACM
void get_next(string t ,int* next){ //t[0]存放元素个数,从t[1]开始存放元素;
int j=0,i=1;
next[1]=0;
while(i<t[0]){
if(j==0||t[i]==t[j]){
i++;
j++;
if(t[i]==t[j])next[i]=next[j]; //当i处的元素不匹配时,i,j两处的元素是一样的,故相当于j处的元素也不匹配,所以等于next[j]
else next[i]=j;
}
else j=next[j]; //匹配到i时,i,j两处元素不相等时,相当于匹配到j处的元素不相等,故j=next[j];
}
}
int index_kmp(string s,string t,int pos){
int i=pos;
int j=1;
s=('0'+s.size())+s;
t=('0'+t.size())+t;
int next[t.size()+1];
get_next(t,next);
while(i<=s[0]&&j<=t[0]){
if(j==0||s[i]==t[j]){//当next[1]失配时,j=next[1]=0,i还为当前匹配失败的值,而子串的第一个字符就不匹配故,直接i++,此时j=0,故j也++;
i++;j++;
}
else j=next[j];
}
if(j>t[0]) return i-t[0];
else return 0;
}