字典树
将每个字符串的所有前缀插入进树,采用ID防止重复即可
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
string str;
int n;
int id;
struct stu
{
int m;
int id;
stu* a[26];
stu()
{
m=id=0;
//memset(a,NULL,sizeof(a));
for(int i=0;i<26;i++) a[i]=NULL;
}
};
stu* p=new stu();
void build(stu *root,int cnt)
{
int x=str[cnt]-'a';
if(root->a[x]==NULL)
{
root->a[x]=new stu();
}
root=root->a[x];
if(root->id!=id)
{
root->id=id;
root->m++;
}
if(cnt==str.size()-1) return;
else build(root,cnt+1);
}
int find(stu* root,int cnt)
{
int x=str[cnt]-'a';
root=root->a[x];
if(root==NULL) return 0;
if(cnt==str.size()-1) return root->m;
else return find(root,cnt+1);
}
int main()
{
cin.sync_with_stdio(false);
cin>>n;
while(n--)
{
id=n;
cin>>str;
for(int i=0;i<=str.size()-1;i++)
{
build(p,i);
}
}
int m;
cin>>m;
while(m--)
{
cin>>str;
cout<<find(p,0)<<endl;
}
return 0;
}