문자열 일치
시간 제한 : 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 .
나는 모두가 무력에 의해 그것을 할 수 있다고 생각합니다.
무력 접근 방식의 의사 코드는 다음과 같습니다 :
우리는 주어진 문자열을, 우리는 위의 알고리즘을 사용하는 경우 호출 비교 작업의 수는 무엇인가, 궁금합니다. 우리는이 알고리즘을 실행하기 전에 우리에게 답을 알려주세요.
캐릭터 주어 S [ 0 ... (L)의 예에서 , N - 1 ] 의 긴 공통 프리픽스의 길이를 계산주십시오 들 [ I ... L의 전자 N - 1 ] 과 S [ 0 ... (L)의 예에 해당 - 1 ] 각 I > 0 .
나는 모두가 무력에 의해 그것을 할 수 있다고 생각합니다.
무력 접근 방식의 의사 코드는 다음과 같습니다 :
![](http://acm.hdu.edu.cn/data/images/C722-1006-1.png)
우리는 주어진 문자열을, 우리는 위의 알고리즘을 사용하는 경우 호출 비교 작업의 수는 무엇인가, 궁금합니다. 우리는이 알고리즘을 실행하기 전에 우리에게 답을 알려주세요.
입력
첫 번째 줄은 정수가 들어
T를 테스트 케이스의 수를 나타내는.
각각의 테스트 케이스는 공간을 제외하고 인쇄 가능한 ASCII 문자로 구성된 라인에 하나의 문자열이 포함되어 있습니다.
* 1 ≤ T ≤ 30
* 문자열 길이 ≤ 10 (6) 의 모든 문자열
각각의 테스트 케이스는 공간을 제외하고 인쇄 가능한 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 ** * /