KMP算法:
KMP算法是求解主串和模式串匹配问题的算法。KMP算法试图减少无谓的字符的比较,把专注点放在了已匹配的前缀上,next数组是其中的重要部分,下面有两个推的很好的博客,关于next数组有很好的推理。
参考的博客详解:https://blog.csdn.net/j___t/article/details/88582321;
https://baijiahao.baidu.com/s?id=1659735837100760934&wfr=spider&for=pc
下面是一道模板题:
Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc" and b = "def" then a*b = "abcdef". If we think of concatenation as multiplication, exponentiation by a non-negative integer is defined in the normal way: a^0 = "" (the empty string) and a^(n+1) = a*(a^n).
Input
Each test case is a line of input representing s, a string of printable characters. The length of s will be at least 1 and will not exceed 1 million characters. A line containing a period follows the last test case.
Output
For each s you should print the largest n such that s = a^n for some string a.
Sample Input
abcd
aaaa
ababab
.
Sample Output
1
4
3
Hint
This problem has huge input, use scanf instead of cin to avoid time limit exceed.
题解:
求字符串s的最大循环次数,使用KMP算法计算,需要求最小循环节,然后用长度/最小循环节,
最小循环节=长度-末位失配
Select Code
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
char s[1000010];
int l,nex[1000010];
void getnex()
{
l=strlen(s);
int i=0,j=nex[0]=-1;
while(i<l)
{
if(j==-1||s[i]==s[j])
{
nex[++i]=++j;
if(s[i]==s[nex[i]])
nex[i]=nex[nex[i]];
}
else
j=nex[j];//把变量j回溯到了next[j]
}
}
int main()
{
while(~scanf("%s",s))
{
if(s[0]=='.')
break;
getnex();
int d=1;
if(l%(l-nex[l])==0)
d=l/(l-nex[l]);
printf("%d\n",d);
}
return 0;
}