题目描述

如果一个字符串可以由某个长度为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;
}