传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1355
题目大意:
1355: [Baltic2009]Radio Transmission
Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 591 Solved: 390[][][]Description
给你一个字符串,它是由某个字符串不断自我连接形成的。 但是这个字符串是不确定的,现在只想知道它的最短长度是多少.
Input
第一行给出字符串的长度,1 < L ≤ 1,000,000. 第二行给出一个字符串,全由小写字母组成.
Output
输出最短的长度
Sample Input
8 cabcabca
Sample Output
3
HINT
对于样例,我们可以利用"abc"不断自我连接得到"abcabcabc",读入的cabcabca,是它的子串
Source
题解:这题就是KMP next数组的应用啦(水),最小值就是n-next[n](很容易想吧,因为可行解集为{n-next[n],n-next[next[n]]....)所以最小解显然为n-next[n];
1 #include2 #include 3 #include 4 #define inf 0x7fffffff 5 int n,ans; 6 int next[1000100]; 7 char s[1000100]; 8 using namespace std; 9 int main()10 {11 scanf("%d",&n);12 scanf("%s",s+1);13 ans=0;14 int fix=0;15 for (int i=2; i<=n; i++)16 {17 while (fix && s[fix+1]!=s[i]) fix=next[fix];18 if (s[fix+1]==s[i]) fix++;19 next[i]=fix;20 }21 printf("%d\n",n-next[n]);22 }