제목 설명
문자열의 특정 문자열 B , B는 추구 는 A 의 발생 수를. 와 B 영어 문자는 대문자 또는 소문자입니다.
생각
분명히, 이것은 내 경로 문자열 매칭 문제가, 우리는 KMP로 해결할 수 있습니다. 문자열의 해시 :하지만 여기에 내가 주로 더 간단한 방법을 소개하고자합니다. 우리는 16 진수 B의 문자열로 볼베이스 (B)에 갔다. 가능한 한 빨리 문자열 길이의 해쉬 값을 얻기 위해, 우리는 스크롤 해시를 사용할 수 있습니다. 이 프로세스는 재귀를 사용하여 완성 될 수있다 : H (. C, K + 1) = H (C, K) + B * C K + 1. . 따라서 우리는 N 개 (K)는 다음 식으로부터 시작되는 문자열의 길이로부터 계산 된 해시 값을 찾을 수있다 :
H (C ') = H (C, K + N) -H (C, K) * B의 N .
그 다음 줄에 다시 할.
코드
#INCLUDE <비트 / stdc ++ H.> 사용 스페이스 성병; 타입 정의 부호없는 긴 긴 날개 펼진; CONST ULL의 B = 131 ; 숯 S1의 [ 1000005 ], S2는 [ 1000005 ]; ULL 전력 [ 1000005 ] 합계 [ 1000005 ]; INT 의 main () { 는 scanf ( " % S %의 S ' , S1 + 1 , S2 + 1 ); 전력 [ 0 ] = 1 ; 위한 ( int로 = 1을 1 ; 나는 < 1000000; 내가 ++ ) 전력 [내가] = 전력 [I- 1 ] * B; INT m = 나 strlen (S1 + 1 ), N = strlen 함수 (S2 + 1 ); 위한 ( int로 난 = 1 ; I <= m; 내가 ++ ) 합 [내가] = 합계 [I- 1 ] * B + S1 [I]; ULL S = 0 , ANS = 0 ; 위한 ( int로 I = 1 ; I ++는, 난 <= N ) S 가 S * B + S2 [I]; 위한 ( int로 I = 0 I <= (MN); 나는 ++) 경우 (S == 합 [I + N] -sum [I] * 힘 [N]) ANS ++ ; 의 printf ( " %의 LLD " , ANS); 반환 0 ; }