题目传送门:http://acm.jlu.edu.cn/joj/showproblem.php?pid=1873
一道字符串的题,应该可以枚举过吧,但是代码量很大,没有写,说一下类似KMP的思想。
用求KMP的next数组一样,next[i]里面记录的是i位置这个字符,在上一个字串出现的位置,之后查看字符串做后一个字符和next记录的数值,两个数值差就是子串长度,如果能整除总长度,就是N,不能整除就是1.
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int next[1000010], len;
char str[1000010];
void getnext() //求next数组
{
int i, k;
next[0] = k = -1;
for (i = 1; i < len; ++i)
{
while (str[i] != str[k + 1] && k > -1)
k = next[k];
if (str[i] == str[k + 1])
k++;
next[i] = k;
}
}
int main()
{
int k, i;
while (scanf("%s", str), strcmp(str, ".") != 0)
{
len = strlen(str);
getnext();
k = 0;
i = len - 1;
i = i - next[i]; //子串长度
if (len % i == 0)
printf("%d\n", len / i);
else
cout << "1" << endl;
}
return 0;
}