字典树模板(HihoCoder - 1014)
#include <bits/stdc++.h>
using namespace std;
struct node{
int z[30];int sum=0;
}tr[1000010]; //数组大小开n(插入最多单词个数)*l(最长单词长度)
int num=0;
void tr_insert(char s[])
{
int st=strlen(s);
int rt=0;
for(int i=0;i<st;i++){
int id=s[i]-'a';
if(!tr[rt].z[id]){
tr[rt].z[id]=++num;
}
rt=tr[rt].z[id];
tr[rt].sum++; //标记前面字符相同,以s[i]结尾的单词个数
}
}
int tr_search(char s[])
{
int st=strlen(s);
int rt=0;
int cou=0;
for(int i=0;i<st;i++){
int id=s[i]-'a';
if(!tr[rt].z[id]){cou++;break;} //如果不存在该节点跳出循环,标记一下
rt=tr[rt].z[id];
}
if(cou==0)return tr[rt].sum;
else return 0;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
char c[11];
scanf("%s",c);
tr_insert(c);
}
int m;
scanf("%d",&m);
int ans=0;
for(int i=1;i<=m;i++){
char c[11];
scanf("%s",c);
cout<<tr_search(c)<<endl;
}
return 0;
}