주제 링크 : HTTPS : //vjudge.net/problem/HDU-1251
질문의 의미하는 것은 : 문자열의 주어진 숫자 후, 고정 접두사 일련의 각 접두사에 대한 접두사로 문자열 쿼리 문자열의 수를 제공합니다.
아이디어 :
나는 항목 제목을 시작으로 오늘 사전 트리를 배우기 시작했다. 배열을 달성하기 위해, 카운트 배열은 루트 노드와 각각의 노드, 트라이 [0]의 발생 회수를 나타낸다.
AC 코드 :
#INCLUDE <cstdio> #INCLUDE <알고리즘> #INCLUDE <CString을> 은 USING 스페이스 STD; CONST INT MAXN = 1E6 + 5. ; // 트리 크기 최대한 비트 업 INT 트리는 [MAXN] 30 [MAXN], NUM, CNT, 숯 STR [ 15 ] 보이드 INSERT ( 숯 * S) { INT LEN = strlen 함수 (S) INT U = 0 ; 대 ( INT I = 0 ; I <LEN; ++ I) { INT T = S [ I] - '' ; 만약 (! {트라이 [U] [t]) ++ CNT; memset 함수 (트라이 [CNT] 0 , 는 sizeof (트라이 [CNT])); 트라이 [U] [t] = CNT; } U = 트라이 [U] [t]; ++ NUM [U]; } } INT의 쿼리 ( 숯 * S) { INT LEN = strlen 함수 (S); int로 유 = 0 ; 위한 ( INT 난 = 0 ; i가 <LEN ++ {I) 지능t = S [I] - ' ' ; 경우 (트라이 [U] [t]!) 복귀 0 ; U = 트라이 [U] [t]; } 리턴 NUM [U]; } int로 () {메인 CNT = 0 ; memset 함수 (트라이 [ 0 , 0 , 는 sizeof (트라이 [ 0 ])); memset 함수 (NUM, 0 , 는 sizeof (NUM)); 동안 (이 (STR), STR 얻는다 [ 0 ]! = ' \ 0 ' ) 를 삽입 (STR); 동안 (~는 scanf ( " % S " , STR)) 의 printf ( " 가 % d \ n " , 질의 (STR)); 반환 0 ; }