[Niuke.com] 접두사 통계 (trie)

제목 설명

링크 제목 :
N 문자열이 지정된 통계 접두사 S 1, S 2 ,, SN S_ {1}, S_ {2}, ..., S_ {N} ...에스(1),에스,. . . ,에스N, 다음MM입니다M 개의 쿼리, 각 쿼리에TT문자열이 제공됩니다.T ,S 1 ∼ SN S_ {1} ∼S_ {N} 찾기에스(1)~에스N몇 개의 문자열이 TT에 있습니까?T 의 접두사 . 입력 문자열의 총 길이는10 6 10 ^ 6을초과하지 않습니다.1 06 , 소문자 만 포함합니다.
입력 설명 :
첫 번째 줄두 개의 정수N, MN, MN , M . 다음NNN 라인에서 라인 당 하나의 스트링S i SiS i . 다음 M 줄에서 한 줄에 하나의 문자열이 쿼리를 나타냅니다.
출력 설명 :
. 각 쿼리 출력 응답을 나타내는 정수를 들면
실시 예 1

입력
3 2
순이
기원전
ABC
ABC
EFG

출력
2
0

C ++ 코드 :

#include<cstdio>
#include<cstring>
   const int maxn=1e6+100;
   int trie[maxn][30];
   int Isword[maxn];
   int id=0;
   void Insert(char *s){
    
    
   int len=strlen(s),p=0;
   for(int i=0;i<len;i++){
    
    
   if(!trie[p][s[i]-'a'])  trie[p][s[i]-'a']=++id; 
   p=trie[p][s[i]-'a'];
   }
   Isword[p]++;    
   }
   int IsPrefix(char *s){
    
    
   int len=strlen(s),p=0,sum=0;
   for(int i=0;i<len;i++){
    
    
   if(!trie[p][s[i]-'a']) return sum;
   p=trie[p][s[i]-'a'];    
   sum+=Isword[p];
   }
   return sum;
   }
   int main(){
    
    
   int N,M;
   scanf("%d%d",&N,&M);
   char S[maxn];       
   while(N--){
    
     
   scanf("%s",&S);
   Insert(S);
   }
   int res=0;
   char T[maxn];     
   while(M--){
    
       
   scanf("%s",&T);
   printf("%d\n",IsPrefix(T));
   }
   return 0;
   }

추천

출처blog.csdn.net/IAMLSL/article/details/115364163