1. 程式人生 > >BZOJ-1355: [Baltic2009]Radio Transmission (傻逼KMP)

BZOJ-1355: [Baltic2009]Radio Transmission (傻逼KMP)

size while 最小 bbs status ++ sample std log

1355: [Baltic2009]Radio Transmission

Time Limit: 10 Sec Memory Limit: 64 MB
Submit: 1046 Solved: 722
[Submit][Status][Discuss]

Description

給你一個字符串,它是由某個字符串不斷自我連接形成的。 但是這個字符串是不確定的,現在只想知道它的最短長度是多少.

Input

第一行給出字符串的長度,1 < L ≤ 1,000,000. 第二行給出一個字符串,全由小寫字母組成.

Output

輸出最短的長度

Sample Input

8
cabcabca

Sample Output

3

HINT

對於樣例,我們可以利用"abc"不斷自我連接得到"abcabcabc",讀入的cabcabca,是它的子串

Source

當 n%(n-next[n])==0 的時候 n-next[n] 就是當前字符串的最小循環節qwq 這性質好像laj在之前某篇博文裏證明過qwq

 1 #include "bits/stdc++.h"
 2 using namespace std;
 3 typedef long long LL;
 4 const int MAX=1e6+5;
 5 char s[MAX];
 6 int len,next[MAX];
 7 void get_next(){
8 int i,j; 9 j=next[0]=-1;i=0; 10 while (i<=len){ 11 if (j==-1 || s[i]==s[j]) next[++i]=++j; 12 else j=next[j]; 13 } 14 } 15 int main(){ 16 freopen ("radio.in","r",stdin);freopen ("radio.out","w",stdout); 17 int i,j; 18 scanf("%d\n%s",&len,s); 19 get_next();
20 printf("%d",len-next[len]); 21 return 0; 22 }

BZOJ-1355: [Baltic2009]Radio Transmission (傻逼KMP)