题目链接。
结题报告:
模板题。
我用的动态分配内存。。每一组数据操作完都要释放内存。。否则的话。会Memory Limit Exceeded的。
#include <stdio.h> #include <stdlib.h> #define MAXN 26 typedef struct TrieNode{ int flag; struct TrieNode *next[MAXN]; }TrieNode; TrieNode *CreateTrieNode(){ TrieNode *p; int i; p = (TrieNode *)malloc(sizeof(TrieNode)); p->flag = 0; for(i=0; i<MAXN; i++) p->next[i] = NULL; return p; } void InsertTrie(TrieNode **T, char *s){ TrieNode *p; if(!(p = (*T))) p = (*T) = CreateTrieNode(); int i=0, k; for(i=0; s[i]; i++){ if(s[i]>='A' && s[i] <= 'Z') k = s[i] -'A'; //大小写不敏感 else k = s[i] - 'a'; if(!p->next[k]) p->next[k] = CreateTrieNode(); p = p->next[k]; } p->flag = 1; } int SearchTrie(TrieNode *T, char *s){ TrieNode *p; if(!(p = T)) return 0; int i, k; for(i=0; s[i]; i++){ if(s[i] >= 'A' && s[i] <= 'Z') k = s[i] - 'A'; else k = s[i] - 'a'; if(!p->next[k]) return 0; p = p->next[k]; } if(p->flag){p->flag = 0; return 1;} else return 0; } void ReleaseTrie(TrieNode *T){ //释放内存 int i; for(i=0; i<MAXN; i++){ if(T->next[i]) ReleaseTrie(T->next[i]); T->next[i] = NULL; } free(T); } int main(){ TrieNode *T; int n, m, i, cnt; char s[20]; while(scanf("%d", &n) == 1 && n != 0){ scanf("%d", &m); cnt = 0; T = NULL; for(i=0; i<n; i++){ scanf("%s", s); InsertTrie(&T, s); cnt++; } for(i=0; i<m; i++){ scanf("%s", s); if(SearchTrie(T, s)) cnt--; } printf("%d\n", cnt); ReleaseTrie(T); } return 0; }