题目:点击打开链接
题意:输入两次字符串,每次输入n、m个,判断n个字符串中,有几个没在m中出现
思路:可以用字典树,也可以用map。
首先是字典树的代码:
#include <stdio.h>
#include <string.h>
struct node
{
int flag;
int z[26];
} num[1000001];
char s[100];
char ss[100];
int ns=0;
int newnode()
{
int p=ns;
ns++;
for(int i=0; i<26; i++)
{
num[p].z[i]=-1;
}
num[p].flag=0;
return p;
}
void creat()
{
int i,k;
scanf("%s",s);
k=strlen(s);
int qian;
qian=0;
int p;
for(i=0; i<k; i++)
{
if(s[i]>='A'&&s[i]<='Z')s[i]=s[i]-'A'+'a';//A-a;
int t=s[i]-'a';
if(num[qian].z[t]==-1)
{
p=newnode();
num[qian].z[t]=p;
}
else p=num[qian].z[t];
qian=p;
}
num[p].flag=1;
}
int su=0;
int len;
int Search(int rt)
{
int j;
int q=rt;
for(j=0; j<len; j++)
{
if(ss[j]>='A'&&ss[j]<='Z')ss[j]=ss[j]-'A'+'a';//A-a;
if(num[q].z[ss[j]-'a']==-1)return 0;
q=num[q].z[ss[j]-'a'];
}
if(num[q].flag==1)
{
num[q].flag=0;
return 1;
}
return 0;
}
int main()
{
int n,m;
while(~scanf("%d",&n))
{
if(n==0)
break;
scanf("%d",&m);
ns=0;
int root=newnode();
int nn=n;
while(n--)
{
creat();
}
int sum=0;
while(m--)
{
scanf("%s",ss);
len=strlen(ss);
sum+=Search(root);
// printf("%d\n",sum);
}
printf("%d\n",nn-sum);
}
return 0;
}
map的代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
#include <map>
using namespace std;
int main()
{
int n,m;
int i,j;
string a;
while(scanf("%d",&n)!=EOF)
{
if(n==0)
break;
scanf("%d",&m);
map<string,int>q;
map<string,int>p;
for(i=0;i<n;i++)
{
cin>>a;
transform(a.begin(),a.end(),a.begin(),::tolower);
q[a]++;
}
for(i=0;i<m;i++)
{
cin>>a;
transform(a.begin(),a.end(),a.begin(),::tolower);
if(q[a]!=0)
{
n--;
q[a]=0;
}
}
printf("%d\n",n);
}
return 0;
}