字典树,注意到最后用完字典树的时候把字典树删除,要不容易产生空间不足。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
using namespace std;
struct list
{
int leap;
struct list *num[26];
};
int number;
char str[10];
struct list *code()
{
int i;
struct list *p;
p=new list();
p->leap=0;
for(i=0;i<26;i++)
{
p->num[i]=NULL;
}
return p;
}
void in(struct list *q,char *s)
{
struct list *p;
p=q;
int n,t,i;
n=strlen(s);
for(i=0;i<n;i++)
{
t=s[i]-'a';
if(p->num[t]==NULL)
p->num[t]=code();
p=p->num[t];
}
p->leap=1;
}
void search(struct list *q,char *s)
{
struct list *p;
p=q;
int n,i,t;
n=strlen(s);
for(i=0;i<n;i++)
{
t=s[i]-'a';
if(p->num[t]==NULL)
break;
p=p->num[t];
}
if(p->leap==1)
number--;
p->leap=0;
}
void strr(char *s)
{
int n,i;
n=strlen(s);
for(i=0;i<n;i++)
{
if(s[i]>='A'&&s[i]<='Z')
s[i]=s[i]+'a'-'A';
}
}
void del(struct list *p)
{
int i;
if(p)
{
for(i=0;i<26;i++)
{
if(p->num[i])
del(p->num[i]);
}
}
free(p);
p=NULL;
}
int main()
{
int m,n,i;
while(cin>>n,n)
{
number=n;
cin>>m;
getchar();
struct list *tree;
tree=code();
for(i=0;i<n;i++)
{
gets(str);
strr(str);
in(tree,str);
}
for(i=0;i<m;i++)
{
gets(str);
strr(str);
search(tree,str);
}
printf("%d\n",number);
del(tree);
}
return 0;
}