题目大意
先给出 n n n个字符串,再给出 m m m个询问,每个询问包含一个字符串,表示询问给出的字符串中有多少个是询问字符串的后缀。
题目分析
字典树,先根据给出的字符串建立一棵字典树,再根据询问直接查询。
C o d e Code Code
#include<iostream>
#include<cstring>
#include<cstdio>
#define sco 1000010
using namespace std;
int n,m,tot=1,ce[sco],trie[sco][30];
char s[sco],t[sco];
inline void insert(){
int len=strlen(s+1),p=1;
for(int i=1;i<=len;++i){
int ch=s[i]-'a';
if(!trie[p][ch]){
trie[p][ch]=++tot;
}
p=trie[p][ch];
}
ce[p]++;
}
inline int get_ans(){
int len=strlen(t+1),p=1,ans=0;
for(int i=1;i<=len;++i){
p=trie[p][t[i]-'a'];
if(!p)return ans;
ans+=ce[p];
}
return ans;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i){
scanf("%s",s+1);
insert();
}
for(int i=1;i<=m;++i){
scanf("%s",t+1);
printf("%d\n",get_ans());
}
}