문자열 찾기

https://loj.ac/problem/103

제목 설명

  문자열의 특정 문자열 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 ; 
}

 

추천

출처www.cnblogs.com/fangbozhen/p/11618425.html