1355: [Baltic2009]Radio Transmission
Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 465 Solved: 301
[Submit][Status][Discuss]
Description
给你一个字符串,它是由某个字符串不断自我连接形成的。 但是这个字符串是不确定的,现在只想知道它的最短长度是多少.
Input
第一行给出字符串的长度,1 < L ≤ 1,000,000. 第二行给出一个字符串,全由小写字母组成.
Output
输出最短的长度
Sample Input
8
cabcabca
cabcabca
Sample Output
3
HINT
对于样例,我们可以利用"abc"不断自我连接得到"abcabcabc",读入的cabcabca,是它的子串
Source
很经典(水)的题。。。利用next数组的性质直接可以得出答案为n-next[n]。。。
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; char s[1000010]; int next[1000010],n; void getnext(){ for (int i=2,j=0;i<=n;i++){ while (s[j+1]!=s[i] && j>0) j = next[j]; if (s[j+1]==s[i]) j++; next[i] = j; } } int main(){ scanf("%d",&n); scanf("%s",s+1); getnext(); printf("%d",n-next[n]); }