고급 실험 5-3.4 미니 검색 엔진 (35 점)

간단한 검색 엔진 기능의 구현은 신속까지 충족 키워드 쿼리 요청.

입력 형식 :

첫째, 입력은 양의 정수 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 ;
}

 

추천

출처www.cnblogs.com/8023spz/p/12315902.html