#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模板。