주제 포털
-------------------------------------- 새해가 집에서 몇 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 시간을 확보 첫 번째 점프의 깊이의 높은 쪽을 보장하지 못한다. 다른 사람의 코드를 볼 수있는 선 보이지 않았다, 사용 토폴로지이라고합니다. 하지만 느낌은 여기 위상 종류의 큐 깊이이었다.