题目描述
题目链接:前缀统计
给定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} S1∼SN中有多少个字符串是 T T T的前缀。输入字符串的总长度不超过 1 0 6 10^6 106,仅包含小写字母。
输入描述:
第一行两个整数 N , M N,M N,M。接下来 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;
}