//查询字符串是否出现过
#include "bits/stdc++.h"
using namespace std;
const int N = 100005;
int n,m;
int num[N];//标记这个编号是不是一个单词的结尾
int son[N][30];//根节点
int indx;
void init(){ //初始化
for(int i=0;i<=indx;i++){
num[i]=0;
for(int j=0;j<=26;j++){
son[i][j]=0;
}
}
indx=0;
}
void insert(string str){ //插入
int x=0;
for(int i=0;i<str.size();i++){
int y=str[i]-'a';
if(son[x][y]==0) son[x][y]=++indx;
x=son[x][y];
}
num[x]++;
}
int query(string str){ 查询
int x=0;
int sum=0;
for(int i=0;i<str.size();i++){
int y=str[i]-'a';
x=son[x][y];
if(x==0) return sum;
sum+=num[x];
}
return sum;
}
int main(){
cin>>n>>m;
init();
string s;
indx=0;
memset(num,0,sizeof(num));
memset(son,0,sizeof(son));
for(int i=1;i<=n;i++){
cin>>s;
insert(s);
}
for(int i=1;i<=m;i++){
string str;
cin>>str;
cout<<query(str)<<endl; //问s1 - sn 中有多少个字符串是 str 的前缀
// if(query(s)==1) cout<<"YES"<<endl;
// else cout<<"NO"<<endl;
}
}
trie树模板(前缀树)
于 2022-03-20 21:37:28 首次发布