항목 링크 : HTTPS : //vjudge.net/problem/HDU-3746
질문의 의미 : 적어도 추가 문자열을 감안하면 전체 문자열이 순환 얼마나 많은 양 끝 요소가되도록 요청합니다.
아이디어 :
NEX의 KMP 어레이의 특성을 적용 어레이 최소 사이클 부 L = 렌 NEX-[LEN]이고 , 증거 참조 http://www.cnblogs.com/wuyiqi/archive/2012/01/06/2314078.html한다.
렌 %의 L == 0 인 경우, 출력 0.
그렇지 않으면, 출력 L-렌 % L.
AC 코드 :
#INCLUDE <cstdio> #INCLUDE <CString을> #INCLUDE <알고리즘> 사용 스페이스 성병; CONST의 INT maxn 1E5 + = 5 ; INT T, LEN, NEX [maxn]; 문자 S [maxn]; 보이드 get_next () { INT의 J; J = NEX [ 0 ] = - 1 ; 위한 ( int로 I = 1 ; i가 <렌; ++ I) { 동안 (j> - 1 ! && S [I] = S [J + 1 ]) J = NEX [J] 경우 (S [I] == S [J + 1 ]) ++제이; NEX은 [I] = J 단계; } } INT 의 main () { 는 scanf ( " %의 D ' , T); 반면 (T-- ) { 는 scanf ( " %의 S ' , S); LEN = 나 strlen (S); get_next (); INT T1 len- = 1 , T2 = NEX [T1]; 경우 (T2에 == - 1 ) { 의 printf ( " % D \ 없음 " 렌); } 다른 { INT의 T3 = len- (T2 + 1); 만약 LEN (%의 T3의 == 0 ) { (의 printf " 0 \ n " ); } 다른 { 의 printf ( " % D \ 없음 " , T3-LEN의 %의 T3); } } } 반환 0 ; }