제목 설명
당신에게 문자열을 지정, 그것은 끊임없는 자기를 형성하는 연결 문자열입니다. 그러나 문자열은 불확실하다, 지금은 단지 그 짧은 길이 얼마나 알고 싶어요.
입력 및 출력 형식
입력 형식 :
첫 번째 행은 문자열 1,000,000 ≤ 1 <L의 길이를 제공한다.
두 번째 줄은 문자열의 모든 소문자를 제공합니다.
출력 형식 :
짧은 길이의 출력
샘플 입출력
설명
샘플의 경우, 우리는 "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 }