Radio Transmission(bzoj 1355)

Description

给你一个字符串,它是由某个字符串不断自我连接形成的。 但是这个字符串是不确定的,现在只想知道它的最短长度是多少.

Input

第一行给出字符串的长度,1 < L ≤ 1,000,000. 第二行给出一个字符串,全由小写字母组成.

Output

输出最短的长度

Sample Input

8
cabcabca

Sample Output

3

HINT

对于样例,我们可以利用"abc"不断自我连接得到"abcabcabc",读入的cabcabca,是它的子串

/*
  答案为n-fail[n]
  我们可以分n-fail[n]>=n/2和n-fail[n]<n/2来讨论,画画图就可以得出结论。 
*/
#include<cstdio>
#include<iostream>
#define N 1000010
using namespace std;
int fail[N],n;
char s[N];
int main(){
    scanf("%d%s",&n,s+1);
    fail[1]=0;
    for(int i=2;i<=n;i++){
        int p=fail[i-1];
        while(p&&s[p+1]!=s[i]) p=fail[p];
        if(s[p+1]==s[i]) fail[i]=p+1;
        else fail[i]=0;
    }
    printf("%d",n-fail[n]);
    return 0;
}

 

posted @ 2017-02-18 21:55  karles~  阅读(177)  评论(0编辑  收藏  举报