题目描述
如果一个字符串可以由某个长度为k的字符串重复多次得到,我们说该串以k为周期。例如abcabcabcabc以3为周期(当然他也以6,12为周期)。输入一个长度不超过100000的串,输出他的最小周期。
输入
多组测试数据,每组仅一行为一个仅有大写字母组成的字符串。
输出
对于每组数据输出该字符串的最小周期。
样例输入
复制样例数据
HOHO
样例输出
2
裸的KMP,也没有什么好说的吧。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int nt[100010];
char s[100010];
void kmp_pre(char x[],int nt[])
{
int m = strlen(x);
int i,j;
j = nt[0] = -1;
i = 0;
while(i < m)
{
while(-1 != j && x[i] != x[j])
j = nt[j];
nt[++i] = ++j;
}
}
int main()
{
while(scanf("%s",s) != EOF)
{
kmp_pre(s,nt);
int l = strlen(s);
printf("%d\n",l - nt[l]);
}
return 0;
}