루오 구 -P5357- [템플릿] AC 오토 마톤 (보조 향상된 버전)

주제 포털

-------------------------------------- 새해가 집에서 몇 AC을 이번 주 수선 지루 자동 컴퓨터 템플릿 제목

솔 : AC 자동 기계를 반복 방문 측면을 생산하는 데 실패 점프 해결해야하지만, 마지막 날이 시간은 76 포인트를 얻을 수, 죽을있다. 우리는 실패면 문자열 후 스캔 된 한 번 점프로 처리했습니다.

  • AC 자동 장치
    #INCLUDE <비트 / stdc ++ H.>
     사용  스페이스 성병; 
    형식 정의를 오래  오래 LL을; 
    쌍 타입 정의 < INT , INT > PII;
    CONST  INT MAXN = 200,010 ;
    구조체 트리는 {
         INT의 아들 [MAXN는 [ 26 ], [MAXN] 실패;
        INT 케 [MAXN]; INT 머리, 꼬리;
        INT CNT [MAXN]; INT 어린 아이, 루트;
        INT add_node () { 
            memset 함수 (SON [TOT] - 1 , 를 sizeof (SON [TOT])); 
            CNT [TOT] = 0 ;
            돌아 어린 아이를 ++ ; 
        } 
        공극 초기화 () { 
            머리 = 꼬리 = 0 ; 
            TOT = 0 ; 
            루트 = add_node (); 
        } 
        INT의 인서트 (  * S) {
             INT p = 루트;
            위한 ( INT 난 = 0 , S [I]; I ++ ) {
                 INT의 인덱스 = S [I] - ' ' ;
                만약 (SON [P] 인덱스] == - 1) 
                    아들 [P] [인덱스] = add_node (); 
                P = 아들 [P] 인덱스]; 
            } 
            반환 P는; 
        } 
        공극 빌드 () { 
            [루트] 실패 = 루트;
            위한 ( INT 난 = 0 ; I < 26 ; I ++ ) {
                 경우 (SON [루트] [I] == - 1 ) 아들 [루트] [I] = 루트;
                다른 { 
                    실패 [아들 [루트] [I]] = 루트; 
                    가야 [ ++ 꼬리] = 아들 [루트] [I]
                } 
            } 
            동안 (헤드! = {꼬리)
                 INT p = 케 [++ 헤드];
                위한 ( INT 난 = 0 ; I < 26 ; I ++ ) {
                     경우 (SON [P] [I] == - 1 ) 아들 [P] [I] = 아들 [실패 [P] [I];
                    { 
                        실패 [아들 [P]를 [I] = 아들 [실패 [P] [I]; 
                        케 [ ++ 꼬리 = 아들 [P] [I]; 
                    } 
                } 
            } 
        } 
        무효풀기가 (* S) {
             INT의 p = 루트;
            위한 ( INT 난 = 0 , S [I]; I ++ ) {
                 INT의 인덱스 = S [I] - ' ' ; 
                P = 아들 [P] 인덱스]; 
                CNT [P] ++ ; 
            } 에 대해 ( INT 나 꼬리 =; I> = 1 , 난 - ) {
                 INT p = 케 [I]; 
                CNT는 [P 실패] + = CNT [P]; 
            } 
        } 
    } AC; INT 앵드 [MAXN];
            
     // 로컬 문제를 실행하지, 그들은 로스 계곡 인덱스 컴파일 오류라는보고 
    는 char S [ 2000010를 ]
     INT 주 () {
         int로 ac.init ();하며 N- 
        는 scanf ( " % d 개 " , N- 형을) ;
          ( INT I = . 1 ; I <= N- I ++ ) { 
            는 scanf ( " %의 S ' , S) 
            앵드 [I] = ac.insert (S) 
        } 
        ac.build (); 
        는 scanf ( " %의 S " , S) ac.slove (S)
         에 대한 ( INT I = . 1 ; I <= N-; I ++ ) 
            의 printf ( " % D \ n " , ac.cnt [앵드 [I]);
        반환  0 ; 
    }

    연속 40 점, 60 점, 76 점 후, 마지막으로 얻는다. 점프 최후의 노드를 이용하여 필기 큐 계층 BFS 시간을 확보 첫 번째 점프의 깊이의 높은 쪽을 보장하지 못한다. 다른 사람의 코드를 볼 수있는 선 보이지 않았다, 사용 토폴로지이라고합니다. 하지만 느낌은 여기 위상 종류의 큐 깊이이었다.

추천

출처www.cnblogs.com/Angel-Demon/p/12233327.html