간단한 검색 엔진 기능의 구현은 신속까지 충족 키워드 쿼리 요청.
입력 형식 :
첫째, 입력은 양의 정수 N ( ≤ 100), 파일의 총 수. 그런 다음 각 파일의 내용은 다음 형식으로 제공됩니다 : 첫 번째 줄은 문서의 제목을 제공하지 않으며, 다음 더 이상 텍스트 파일의 100 개 라인에 비해 줄 행의 마지막으로, 단지 문자. #
, 파일의 끝을 나타내는. 각 행은 50 자하지 않습니다. 쿼리 전체 수 M (주어진 문서의 N 함량의 종료 후에 M 행 하였다를 ≤), 각 행은 공간을두고, 각 단어 이상 10 개 문자를 구분으로 구분하여 10 개 영어 단어보다 더 지정하지 물품.
출력 형식 :
각 쿼리의 경우, 출력 파일의 행 제 모든 쿼리 단어의 총 수를 포함 갯수가 0이면 출력되는 경우 Not Found
. 당신이 일치하는 문서를 발견하는 경우, 주문 입력 출력을 형식이 파일 키를 누릅니다 출력 파일 제목의 첫 번째 줄을, 그 라인의 순차적 출력 내용이 쿼리 단어가 포함되어 있습니다. 동일한 행의 출력을 반복 할 수 없습니다.
샘플 입력 :
4
A00
Gold
silver truck
#
A01
Shipment of gold
damaged
in a fire
#
A02
Delivery
of silver
arrived in
a silver
truck
#
A03
Shipment of gold
arrived in
a truck
#
2
what ever
silver truck
샘플 출력 :
0 Not Found 2 A00 silver truck A02 of silver a silver truck
문서 제목은 각 파일에 쿼리를 위해 존재 몇 줄을 가지고, 외부에서 각 레코드에 해당하는 정수 배열 맵핑 문자열로 문자열을 변환 할 unordered_map도 쉬운 다음, 공간, getchar가 전체 통합 문자 읽 존재하고 있습니다 각 파일을 통해 층은 내부 문자열을 통과, 기록에있는 문자열은 파일 번호로해야하고, 각 행은 재 출력, SET에 대한 모든 기록을 포함한다.
코드 :
#INCLUDE <cstdio> #INCLUDE <iostream> #INCLUDE <CString을> #INCLUDE <벡터> #INCLUDE <unordered_map도> #INCLUDE <cctype> #INCLUDE < 세트 > 사용 스페이스 성병; unordered_map도 < 문자열 , 짧은 > POS는; ///는 문자열 INT 매핑 벡터 < 짧은 > F [ 1,000 ] [ 100 ] /// , 문자열에 포함되는 파일의 수에 대응하는 기록 라인 번호 숯 S [ 100 ] [ 101 ] 51은 , 이름 [ 100 ] (51)은 ,] STR [ 101 ], 시드는 [ 10 ] . 11 , CH; INT NO; INT 의 main () { INT N-, m; scanf와 ( " %의 D ' , N); 위한 ( INT 난 = 0 , N I <; 나는 ++ ) { ) (getchar가; INT C = 0 , D- = 0 , E = 0 ; 반면 (! (이름 [I] [C] = getchar가 ()) = ' \ n ' ) C ++ ; 이름 [I] [C] = 0 ; C = 0 ; 반면 ((CH = getchar가 ()) && CH! = ' # ' ) { 경우 (CH2 == ' ' || CH == ' \ n ' ) { STR [E] = 0 ; 만약 (! 볼때에 STR) POS [STR = ++ 없음; F [POS [STR] [I] .push_back (c); E = 0 ; 경우 (CH2 == ' \ n ' ) { S [I] [C], [D] = 0 ; D = 0 ; C ++ ; 계속 ; } } 다른 STR [E ++ = tolower를 (CH); S [I] [C], [D ++ = CH; } } scanf와 ( " %의 D ' , m); ) (getchar가; 반면 (m - ) { INT C = 0 , NN = 0 ; 설정 < INT > ANS [ 100 ]; /// 记录输出的行号 동안 ((CH = getchar가 ())! = ' \ n ' ) { 경우 (CH2 == ' ' ) 시든 [NN ++] [C] = 0 , C = 0 ; 다른 시든 [NN] [C ++] = tolower를 (CH); } 시든 [NN ++] [C] = 0 ; // INT ansnum [ 100 ]; INT NUM = 0 , J; 위한 ( INT 난 = 0 , N 난 <; I ++ ) { 대한 (j = 0 ; j를 <NN; J ++ ) { 경우 (F [POS [시든 [J] [i]를 .empty () ) 휴식 ; } 만약 (j <NN)가 계속 ; ansnum [NUM ++ = I; 대 ( INT J = 0 ; J <NN; J ++ ) { INT D = POS [시든 [J]]; 위해 (자동는 [D] F = [I] .begin ()! = 그것은 F [D] [I] .END ()을 ++ ) { ANS [I]를 취소하려면 ( * 로); } } } 의 printf ( " 가 % d \ n " , NUM); 만약 (! NUM)의 printf는 ( " 찾을 수 \ n 수 없음 " ); 위한 ( INT 난 = 0 ; I <NUM 단계; I ++ ) { INT D = ansnum [I]; 의 printf ( " % S \ n " , 이름 [D]); 대 (자동 그것을 ANS = [D] () .begin, 그것은 ANS = [D] .END ()! 그것은 ++ ) { 는의 printf ( " % S \ n은 " s가 [D] [* 이것은]); } } } 반환 0 ; }