http://acm.sdut.edu.cn:8080/vjudge/contest/view.action?cid=203#problem/D
以前用字典树做过
#include <string.h>
#include <stdio.h>
#include <string>
#include <map>
using namespace std;
int main()
{
char a[30];
int n,m,sum,l;
while(scanf("%d",&n)!=EOF&&n!=0)
{
sum=0;
scanf("%d",&m);
map<string,int>q;
q.clear();
for(int i=0; i<n; i++)
{
scanf("%s",a);
l=strlen(a);
for(int j=0; j<l; j++)
a[j]=tolower(a[j]);//将字符转换成小写字符
q[a]++;
}
while(m--)
{
scanf("%s",a);
l=strlen(a);
for(int i=0;i<l;i++)
a[i]=tolower(a[i]);
if(q.count(a)>0)
{
sum++;
q.erase(q.find(a));
}
}
printf("%d\n",n-sum);
}
return 0;
}
第一次做的方法
#include<stdio.h>
#include<iostream>
#include<map>
#include<stdlib.h>
#include<string.h>
using namespace std;
char a[20001][11];
int main()
{
int n,m,l;
char b[11];
map<string,int>q;
while(scanf("%d",&n)!=EOF&&n!=0)
{
q.clear();
scanf("%d",&m);
getchar();
for(int i=0;i<n;i++)
{
gets(a[i]);
l=strlen(a[i]);
for(int j=0;j<l;j++)
{
if(a[i][j]>='A'&&a[i][j]<='Z')
a[i][j]=a[i][j]+32;
}
q[a[i]]++;
}
for(int i=1;i<=m;i++)
{
gets(b);
l=strlen(b);
for(int i=0;i<l;i++)
{
if(b[i]>='A'&&b[i]<='Z')
b[i]=b[i]+32;
}
q[b]--;
}
int sum=0;
for(int i=0;i<n;i++)
{
if(q[a[i]]>=1)
sum++;
}
printf("%d\n",sum);
}
return 0;
}
大神的代码
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <set>
using namespace std;
int main()
{
int n,m,i,j,len;
char s[30];
while(scanf("%d",&n)!=EOF&&n)
{
set<string>mp;//声明set容器
set<string>::iterator it;//声明set迭代器
scanf("%d",&m);
getchar();
for(i=0; i<n; i++)
{
gets(s);
len=strlen(s);
for(j=0; j<len; j++)
{
s[j]=towlower(s[j]);
}
mp.insert(s);//向set里加入一个元素
}
for(i=0; i<m; i++)
{
gets(s);
len=strlen(s);
for(j=0; j<len; j++)
{
s[j]=towlower(s[j]);
}
if(mp.count(s))//判断容器里是否存在该元素
mp.erase(s);//如果容器里存在该元素,则删除
}
printf("%d\n",mp.size());//输出容器内剩余元素个数
}
return 0;
}