KMP (가장 긴 접두사와 접미사)

http://acm.hdu.edu.cn/showproblem.php?pid=1358

기간

문제 설명
N 문자로 주어진 문자열 S의 각 접두사 (각 문자가 포함 된 97 및 126 사이의 ASCII 코드가)의 경우, 우리는 접두사가주기적인 문자열인지 알고 싶어요. 즉, 각각 들면, I (2 <= 난 = N을 <) 우리는 난과 같이 쓸 수있다 길이 S의 프리픽스되도록 (존재하는 경우) 최대 K> 1를 알고 자 K가 , 그 연접 인 K 시간은 물론, 일부 문자열 A.를 위해, 우리는 또한 기간 K.을 알고 싶어요
 

 

입력
입력 파일은 여러 테스트 케이스로 구성되어 있습니다. 각각의 테스트 케이스는 두 개의 라인으로 구성되어 있습니다. 첫 번째 N 포함 (2 <= N <= 1,000,000) - 캐릭터 S. 번째 라인의 크기가 그 위에 숫자 0을 갖는 입력 파일이 광고로 끝나는 문자열 S.를 포함한다.
 

 

산출
각 테스트 케이스에 출력 "테스트 케이스 #"단일 라인에 연속 테스트 케이스 번호; 이어서, 길이가 각각 접두사 나 그 기간 K> 1을 가지며, 출력 프리픽스 크기 나 단일 공백으로 구분 기간 K; 접두사 크기가 증가하는 순서에 있어야합니다. 각 테스트 케이스 이후에 빈 줄을 인쇄합니다.
 

 

샘플 입력
3 단 12 0 aabaabaabaab
 

 

샘플 출력
테스트 케이스 # 1
2 2
3 3
테스트 케이스 # 2
2 2
6 2
9 3
12 4
 
권하다
JGShining
 
문자열, 모든 출력 Q : 문제의 의미 길이 얼마나 (전체 길이 이하), 두 개의 동일한 서브 - 스트링 최소로 할 수있다
 참고 : 제목은 혼자 긴 접두사와 접미사를 찾고, 그 다음에 배열 최적화를 수행하지 않는 것이 좋습니다 (일치하는 문제가 사용할 수 있습니다)
 
#INCLUDE <cstdio> 
#INCLUDE <CString을> 
#INCLUDE <cmath> 
#INCLUDE <알고리즘> 
#INCLUDE <iostream> 
#INCLUDE <알고리즘> 
#INCLUDE <iostream> 
#INCLUDE <cstdio> 
#INCLUDE < 문자열 > 
#INCLUDE <CString을> 
사용법 #include <stdio.h에> 
사용법 #include < 문자열 .H>
 사용하여  네임 스페이스 표준을;
숯불 이 [를 1,000,009 ]; 


보이드 GETNEXT ( CHAR * A, INT다음) 
{ 
    다음 [ 0 ] = - 1 ;
    INT의 K = - 1 , J = 0 ;
    반면 (j < LEN) 
    { 
        경우 - (k는 == 1 || A [J]를 == A [K]) 
        { 
            (k)를 ++ ; 
            J ++ ; 
            다음 [J] = K; 
        } 
        다른 
        { 
            K = 다음 [K]; 
        } 
    } 
} 

int로 주 () 
{ 
    지능N-, ANS = 0 ;
     그동안 (~는 scanf ( " %의 D " , 및 N-)를 && N-) 
    { 
        INT 다음 [ 1000009 ] 
        는 scanf ( " %의 S ' , A); 
        의 printf ( " 테스트 케이스 # % D \ N- ' , ++ ANS) 

        memset 함수 (다음, 0 , sizeof의 (다음)); 
        GETNEXT (A, N-, 다음) // 다음 어레이 찾기 
        위한 ( INT I = 2 <= N- I; I는 ++)이 // 각 반복을 2 문자열보다 큰 
        {
             //I % I (I - 다음 [ I]) 스트링이 숫자로 구성되어 있음을 나타낸다 (보다 큰) 동일한 문자열 
            IF (다음 [I]> = 1. && I % (I - 다음 [I]) = = 0 ) 
            { 
                INT의 L = I은 - 다음 [I] 
                의 printf ( " % D % D \ N- ' , I, I / L); // I / L가 동일한 이루어지는 문자열 동일한 번호를 찾을 
            } 
        } 
        의 printf ( " \ N- " ); 
    } 

    반환  0 ; 
}

 

추천

출처www.cnblogs.com/nonames/p/11294291.html