int next[maxn];
void getnext(string pattern, int len)
{
int k=-1 ;
next[0 ]=-1 ;
for (int i=1 ;i<len;i++)
{
while (k>-1 &&pattern[k+1 ]!=pattern[i]) k=next[k];
if (pattern[k+1 ]==pattern[i])
k++;
next[i]=k;
}
}
int kmp(string pattern,int plen,string target,int tlen)
{
int k=-1 ;
int cnt=0 ;
for (int i=0 ;i<tlen;i++)
{
while (k>-1 &&pattern[k+1 ]!=target[i]) k=next[k];
if (pattern[k+1 ]==target[i])
k++;
if (k==plen-1 )
cnt++,k=next[k];
}
return cnt;
}
void get_next(string T )
{
//i是后缀,j是前缀,前缀是固定的,后缀是相对的。
int j=-1 ;
int i=0 ;
next [0 ]=-1 ;
while (i<T.size())
{
if (j==-1 ||T [i]==T [j])
{
i++;
j++;
if (T [i]!=T [j])
next [i]=j;
else
next [i]=next [j];
}
else
j=next [j];
}
}
int kmp(string t,string s)
{
cnt=0 ;
int i=0 ,j=0 ;
while (i<s.size())
{
if (j==-1 ||t[j]==s[i])
{
i++;
j++;
}
else
j=next [j];
if (j==t.size())
{
cnt++;
j=next [j];
}
}
return cnt;
}