//kuangbin的模板:
int S[maxn];
int T[maxn];
int next_[maxn];
int tlen,slen;
void GetNext()
{
int k=-1;
next_[0]=-1;
int j=0;
while(j<tlen)
{
if(k==-1||T[j]==T[k]) next_[++j]=++k;
else k=next_[k];
}
}
//返回第一个匹配字符串的起始位置下标
int KMP_Index()
{
int i=0,j=0;
GetNext();
while(i<slen&&j<tlen)
{
if(j==-1||S[i]==T[j]) ++i,++j;
else j=next_[j];
}
if(j==tlen) return i-tlen+1;
else return -1;
}
//找出匹配字符串出现多少次
int KMP_Count()
{
int res=0;
int j=0;
if(slen==1&&tlen==1)
{
if(S[0]==T[0]) return 1;
else return 0;
}
GetNext();
for(int i=0;i<slen;i++)
{
while(j>0&&S[i]!=T[j]) j=next_[j];
if(S[i]==T[j]) ++j;
if(j==tlen)
{
res++;
j=next_[j];
}
}
return res;
}