【牛客网】前缀统计(trie)

题目描述

题目链接:前缀统计
给定N个字符串 S 1 , S 2 , . . . , S N ​ S_{1},S_{2},...,S_{N}​ S1,S2,...,SN,接下来进行 M M M次询问,每次询问给定一个字符串 T T T,求 S 1 ∼ S N S_{1}∼S_{N} S1SN中有多少个字符串是 T T T的前缀。输入字符串的总长度不超过 1 0 6 10^6 106,仅包含小写字母。
输入描述:
第一行两个整数 N , M N,M NM。接下来 N N N行每行一个字符串 S i Si Si。接下来M行每行一个字符串表示询问。
输出描述:
对于每个询问,输出一个整数表示答案
示例1

输入
3 2
ab
bc
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
今日推荐