[BOI2009의 무선 전송 무선 전송

제목 설명

당신에게 문자열을 지정, 그것은 끊임없는 자기를 형성하는 연결 문자열입니다. 그러나 문자열은 불확실하다, 지금은 단지 그 짧은 길이 얼마나 알고 싶어요.

입력 및 출력 형식

입력 형식 :

첫 번째 행은 문자열 1,000,000 ≤ 1 <L의 길이를 제공한다.

두 번째 줄은 문자열의 모든 소문자를 제공합니다.

출력 형식 :

짧은 길이의 출력

샘플 입출력

입력 샘플 # 1 : 
8 
cabcabca
출력 샘플 # 1 : 

설명

샘플의 경우, 우리는 "ABC"를 사용할 수 있습니다 연속 "abcabcabc"을 얻기 위해 자기가-결찰, cabcabca을 읽고 그것이 문자열 점입니다

 

분석 :

ANS = N- :이 문제는 KMP (또한 템플릿보다 간단 ???),이 질문은 우리가 "루프 문자열의"전화 결론은 문자열의 최소 사이클 길이를 추구의 제목의 기초 다음 [N].

 

암호:

 

1 #INCLUDE <cstdio>
 2 #INCLUDE <iostream>
 3  사용  스페이스 성병;
4  CONST의  INT의 maxn = 1,000,005 ;
5  INT의 N, 다음 [maxn];
6  문자 S [maxn];
7  INT 의 main () {
 8      는 scanf ( " % d 개 %의 S " , N, S + 1 );
9      의 INT J = 0 ;
(10)      에 대한이 ( int로 I = 2 ; 나는 <= N; ++ I) {
 11 일          경우 (j && S [I] = S [J +! 1]) J = 다음 [J]
12          의 경우 (S [I] == S [J + 1 ]) ++ J;
(13)          다음 [I]는 = J;
14      }
 15      의 printf ( " %의 D ' 는, N- 다음 [N]);
16      반환  0 ;
17 }

 

추천

출처www.cnblogs.com/kanchuang/p/11137625.html