#define maxn 1000000
int Next[maxn];
char s[maxn],t[maxn];
int cnt,ind; //cnt记录t串在s串中出现的次数,ind记录t串在s串第一次出现的位置下标
void getNext(int len)
{
int i=0,k=-1;
Next[0]=-1;
while(i<len)
{
if(t[i]==t[k]||k==-1)
Next[++i]=++k;
else
k=Next[k];
}
}
void KMP()
{
int i=0,j=0;
int len1=strlen(s),len2=strlen(t);
getNext(len2);
for(i=0,j=0;i<len1;)
{
if(j==-1||s[i]==t[j])
i++,j++;
else
j=Next[j];
if(j==len2){
if(cnt==0)ind=i-len2; //记录t串第一次出现的下标
cnt++; //t串在s串中的匹配数+1
j=0; //t从头开始继续匹配
}
}
}
以上即为求s串中t串的位置的kmp模板。