kmp算法:
首先,对模式串(t)进行预处理,p[i]表示以模式串的第i位为结尾的非前缀子串能与模式前缀子串的最大长度,p[0]=0。
然后,对主串(s)进行遍历时当s[i]!=t[j]时,j就直接跳到p[j]进行配对即可。
下面先解决p[i]的问题
可以采用自己跟自己配对的方式
代码如下:
vector<int> p;
i=1;
j=0;
while(i<lent)
{
while(i<lent&&t[i]==t[j])
{
j++;
p.push_back(j);
i++;
}
while(j>0&&t[i]!=t[j])
{
j=p[j-1];
}
if(t[i]!=t[j])
{
p.push_back(0);
i++;
}
}