kmp算法:
//求解原串中包含多少模式串,模式串可以互相覆盖,不能覆盖的稍微修改一下即可
char ori[N*100], pat[N];//ori为原串,pat为模式串
int Next[N];
//两个get_next函数,任选其一
//void get_next(char *pat)
//{
// int i = 0, j = -1;
// Next[0] = -1;
// while(pat[i])
// {
// if(j == -1 || pat[i] == pat[j]) Next[++i] = ++j;
// else j = Next[j];
// }
//}
void get_next(char *pat)
{
int i = 0, j = -1;
Next[0] = -1;
while(pat[i])
{
if(j == -1 || pat[i] == pat[j])
{
++i, ++j;
if(pat[i] != pat[j]) Next[i] = j;
else Next[i] = Next[j];
}
else j = Next[j];
}
}
int kmp(char *ori, char *pat)
{
get_next(pat);
int ans = 0;
int i = 0, j = 0;
while(ori[i])
{
if(j == -1 || ori[i] == pat[j]) ++i, ++j;
else j = Next[j];
if(j != -1 && !pat[j]) ans++, j = Next[j];//模式串不能互相覆盖,改j=0即可
}
return ans;
}
int main()
{
int t;
scanf("%d", &t);
while(t--)
{
scanf("%s%s", pat, ori);
int ans = kmp(ori, pat);
printf("%d\n", ans);
}
return 0;
}
//求解字符串的最大循环次数,也就是先求出最小循环周期,在用长度除之
const int N = 1000000 + 10;
char ori[N], pat[N];
int Next[N];
void get_next(char *pat)//必须用这个get_next函数
{
int i = 0, j = -1;
Next[0] = -1;
while(pat[i])
{
if(j == -1 || pat[i] == pat[j]) Next[++i] = ++j;
else j = Next[j];
}
}
int main()
{
while(~scanf("%s", pat))
{
get_next(pat);
int len = strlen(pat);
//满足len % (len - Next[len]) == 0说明字符串是循环的,否则不循环
if(len % (len - Next[len]) == 0) printf("%d\n", len / (len - Next[len]));
else printf("1\n");
}
return 0;
}