(KMP 求循环节)The Minimum Length

http://acm.hust.edu.cn/vjudge/contest/view.action?cid=70325#problem/F

The Minimum Length
Time Limit:1000MS     Memory Limit:131072KB     64bit IO Format:%lld & %llu

Description

There is a string A. The length of A is less than 1,000,000. I rewrite it again and again. Then I got a new string: AAAAAA...... Now I cut it from two different position and get a new string B. Then, give you the string B, can you tell me the length of the shortest possible string A. For example, A="abcdefg". I got abcd efgabcdefgabcdefgabcdefg.... Then I cut the red part: efgabcdefgabcde as string B. From B, you should find out the shortest A.

Input

Multiply Test Cases. For each line there is a string B which contains only lowercase and uppercase charactors. The length of B is no more than 1,000,000.

Output

For each line, output an integer, as described above.

Sample Input

bcabcab
efgabcdefgabcde

Sample Output

3
7
#include<stdio.h>
#include<string.h>

#define N 1000007
#define max(a,b) (a>b?a:b)

int Next[N];
char S[N];

void FindNext(int Slen)
{
    int i=0, j=-1;
    Next[0] = -1;

    while(i<Slen)
    {
        if(j==-1 || S[i]==S[j])
            Next[++i] = ++j;
        else
            j = Next[j];
    }
}

int main()
{
    while(scanf("%s", S)!=EOF)
    {
        int Slen=strlen(S), i;

        FindNext(Slen);

        for(i=Slen; i>0; i--)
        {
            if(i%(i-Next[i])==0)
            {
                printf("%d
", i-Next[i]);
                break;
            }
        }
    }
    return 0;
}
View Code
勿忘初心
原文地址:https://www.cnblogs.com/YY56/p/4835219.html