len%(len - nxt[len])=0 && nxt[len]!=0 循环节公式
void getnxt(char *t)
{
int len = strlen(t);
int j,i=0;
j = nxt[0] = -1;
while(i<len)
{
if(j==-1 || t[i]==t[j])
{
i++,j++;
if(t[i]!=t[j]) //优化 求所有长度的循环节时不能优化
nxt[i] = j;
else
nxt[i] = nxt[j];
}
else
j = nxt[j];
}
}
int KMP(char *p,char *t) //查找字符串 t 在字符串 p 中出现的位置
{
int i,j;
i = j = 0;
//int cnt = 0;
int n = strlen(p);
int m = strlen(t);
while(i<n && j<m)
{
if(j==-1 || t[j]==p[i])
{
i++,j++;
}
else
j = nxt[j];
/*if(j==m)
{
//j = nxt[j]; 有重叠
//j = 0; 无重叠
//cnt++; 出现次数
}*/
}
if(j==m)
return i-j;
else
return -1;
}