字典树,练习模版。
#include<cstdio>
#include<iostream>
using namespace std;
struct Trie
{
int sum;
Trie *next[8];
Trie()
{
int i;
for(i=0;i<8;i++)
next[i]=NULL;
sum=0;
}
}*root=new Trie,*temp;
void DealTrie(char dic[])
{
int i,k;
temp=root;
for(i=0;dic[i]!='\0';i++)
{
if(dic[i]<='s')
if(dic[i]=='s')
k=5;
else
k=(dic[i]-'a')/3;
else
if(dic[i]=='z')
k=7;
else
k=(dic[i]-'t')/3+6;
if(temp->next[k]!=NULL)
temp=temp->next[k];
else
temp=temp->next[k]=new Trie;
}
++(temp->sum);
}
int FindTrie(char dic[])
{
int i;
temp=root;
for(i=0;dic[i]!='\0';i++)
{
if(temp->next[dic[i]-'2']!=NULL)
temp=temp->next[dic[i]-'2'];
else
return 0;
}
return temp->sum;
}
void Freedom(Trie* &p)
{
if(p==NULL)
return ;
int i;
for(i=0;i<8;i++)
if(p->next[i]!=NULL)
Freedom(p->next[i]);
delete p;
p=NULL;
}
int main()
{
int n,m,i,t;
char num[5003][8];
char dic[8];
cin>>t;
while(t--)
{
cin>>n>>m;
for(i=0;i<n;i++)
cin>>num[i];
for(i=0;i<m;i++)
{
cin>>dic;
DealTrie(dic);
}
for(i=0;i<n;i++)
cout<<FindTrie(num[i])<<endl;
for(i=0;i<8;i++)
Freedom(root->next[i]);
}
delete root;
return 0;
}