[전 KMP] HDU 2019 멀티 - 대학 교육 대회 (5) - 문자열 일치

문자열 일치

시간 제한 : 2000/1000 MS (자바 / 기타) 메모리 제한 : 262,144분의 262,144 K (자바 / 기타)
총 제출 (들) : 3131 허용 제출 (들) : 724


문제 설명
문자열 매칭은 컴퓨터 과학 문제의 일반적인 유형입니다. 하나의 문자열 매칭 문제는 다음과 같다 :

캐릭터 주어  S [ 0 ... (L)의 예에서 , N - 1 ] 의 긴 공통 프리픽스의 길이를 계산주십시오  [ I ... L의 전자 N - 1 ]  과  S [ 0 ... (L)의 예에 해당 - 1 ]  각  I > 0 .

나는 모두가 무력에 의해 그것을 할 수 있다고 생각합니다.
무력 접근 방식의 의사 코드는 다음과 같습니다 :



우리는 주어진 문자열을, 우리는 위의 알고리즘을 사용하는 경우 호출 비교 작업의 수는 무엇인가, 궁금합니다. 우리는이 알고리즘을 실행하기 전에 우리에게 답을 알려주세요.
 

 

입력
첫 번째 줄은 정수가 들어  T를 테스트 케이스의 수를 나타내는.
각각의 테스트 케이스는 공간을 제외하고 인쇄 가능한 ASCII 문자로 구성된 라인에 하나의 문자열이 포함되어 있습니다.

1 T 30

* 문자열 길이  10 (6)  의 모든 문자열
 

 

산출
각 테스트를 위해, 우리는 입력 문자열에 대한 문에서 알고리즘을 실행하는 경우 호출 비교 작업의 수를 나타내는 한 줄에 정수를 인쇄 할 수 있습니다.
 

 

샘플 입력
3 _Happy_New_Year_
ywwyww
zjczzzjczjczzzjc
 

 

샘플 출력
(17)
(7)
(32)
1 #INCLUDE <. 비트 / stdc ++ H>
 2  사용  스페이스 성병;
3  CONST의  INT의 AMN 1E6 + = 6 ;
4  문자 A [AMN] STR1 [AMN, STR2 [AMN];
5  INT의 POS [AMN, 전 [AMN] ALEN, BLEN;
6  공극 F () {
 7      POS [ 1 ] = ALEN;
8      INT (X) = 1 ;
9 일      동안 (STR2 [X] == STR2의 [X + 1 ] && X + 1 <= BLEN) X ++ ;
10      POS [ 2 ] X- = 1 ;
(11)     INT의 K = 2 ;
(12)      에 대한이 ( 값 int = 1을 3 ; 나는 = ALEN를 <; 내가 ++ ) {
 13          INT의 p = K + POS [K] - 1 르 POS = [I-K + 1 ];
도 14는          경우 (I 르 <p + + 1 POS [I] =) 제작하는 단계;
15          다른 {
 16              의 INT J = P-I + 1 ;
(17)              만약 (j < 0 ) J = 0 ;
18 일              동안 (STR2 [J + 1 ] == STR2 [내가 + J] && 난과 j <= BLEN) J ++ ;
19              POS는 [I] = J 단계;
(20)             = k는 난;
21          }
 22      }
 23      X = 1 ;
24 일      동안 (STR1 [X] == STR2 [X] && X <= BLEN) X ++ ;
25      예 [ 1 ] X- = 1 ;
26      K = 1 ;
(27)      에 대한이 ( 값 int = I를 2 ] 난 = ALEN를 <; 내가 ++ ) {
 28          INT의 p = K + 전 [K] - 1 르 POS = [I-K + 1 ];
29 일          경우 (I 르 <p + + 1 예 [I] =) 제작하는 단계;
(30)          다른 {
 (31)             INT의 J = P-I + 1 ;
(32)              만약 (j < 0 ) J = 0 ;
33              동안 (STR2 [J + 1 ] == STR1 [내가 + J] && 난과 j <= ALEN && J <= BLEN) J ++ ;
34              예 [I]가 = J;
35              K = I;
36          }
 37      }
 38  }
 39  INT 의 main () {
 40      INT의 T;
41       ANS;
42      는 scanf ( " %의 D ' , T);
43      동안 (T--) {
 44          는 scanf ( " %의 S " , a);
45          ALEN = BLEN = strlen 함수 (a);
46          의 strcpy (STR1 + 1 , a);
47          의 strcpy (STR2 + 1 , a);
48          F ();
49          ANS = 0 ;
(50)          에 대한이 ( int로 I = 2 ; 나는 <= ALEN 단계; 내가 ++ ) {
 51              의 경우 (알렌-I + 1 > 예 [I]) {
 52                  ANS + = 예 [I] + 1 ;
(53)              }
 (54)              = + ANS EX는 [I]을,
 (55)          }
 (56)이다          의 printf ( " % LLD의 \의 N- " , ANS)
 (57)이다      }
 58  }
 59  / * **
 60  스트링의 행 [0 ... 렌-1] , 그것은 S를 계산 마지막 최종 정합 문자열이 아닌 경우 [I ... LEN-1]의 1 추가 것, 긴 공통 프리픽스의 길이 [0 ... 1을 렌] 및
 61이다  KMP 확장 해결하기 위해 사용될
 62  ** * /

 

추천

출처www.cnblogs.com/brainm/p/11306744.html