Radio Transmission(bzoj 1355)
Description
给你一个字符串,它是由某个字符串不断自我连接形成的。 但是这个字符串是不确定的,现在只想知道它的最短长度是多少.
Input
第一行给出字符串的长度,1 < L ≤ 1,000,000. 第二行给出一个字符串,全由小写字母组成.
Output
输出最短的长度
Sample Input
8
cabcabca
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; }