链接 :http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1500
题目大意 : 先输入N个字符串,再输入M个字符串,统计一下N个中有多少个为在M个出现。注意转换大小写。
时间 110MS 内存 1474KB
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cmath>
using namespace std;
struct N
{
char b[11];
bool m;
struct N *l,*r;
};
N *creat()
{
N *p = (N *)malloc(sizeof(N));
p->l = p->r = NULL;
p->m = false;
return p;
}
void insert(char *t,N *root)
{
if(strcmp(t,root->b) > 0)
{
if(root->l == NULL)
{
N *p = creat();
strcpy(p->b,t);
root->l = p;
return ;
}
else
{
insert(t,root->l);
}
}
else if(strcmp(t,root->b) < 0)
{
if(root->r == NULL)
{
N *p = creat();
strcpy(p->b,t);
root->r = p;
return ;
}
else
{
insert(t,root->r);
}
}
else return;
}
bool check(char *s,N *root)
{
if(root == NULL)
return false;
if(strcmp(s,root->b) == 0)
{
if(root->m == false)
{
root->m = true;
return true;
}
else return false;
}
if(strcmp(s,root->b) > 0)
{
return(check(s,root->l));
}
else if(strcmp(s,root->b) < 0)
{
return(check(s,root->r));
}
}
void low(char *s)
{
for(int i = 0;s[i] != '\0'; i++)
{
if('A' <= s[i] && s[i] <= 'Z')
s[i] += 32;
}
}
void qk(N *root)
{
if(root == NULL)
return ;
qk(root->l);
qk(root->r);
free(root);
}
int main()
{
int n,m,sum;
int i;
char t[11];
while(cin>>n && n)
{
cin>>m;
struct N *root = creat();
if(n)
cin>>root->b;
low(root->b);
for(i = 1;i < n; i++)
{
cin>>t;
low(t);
insert(t,root);
}
for(sum = 0,i = 0;i < m; i++)
{
cin>>t;
low(t);
if(check(t,root))
sum++;
}
cout<<n-sum<<endl;
qk(root);
}
return 0;
}