链接 :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] != ' '; 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; }