简单trie树。
代码如下:
1 #include<iostream> 2 #include<string.h> 3 #include<cstdio> 4 #include<cstdlib> 5 6 using namespace std; 7 8 int n; 9 10 typedef struct node 11 { 12 int flag; 13 node *next[26]; 14 }node; 15 16 void strlwr(char *s) //大写转换小写 17 { 18 int i; 19 for (i=0; i<strlen(s); i++) 20 if (s[i] >= 'A' && s[i] <= 'Z') 21 s[i]=s[i]+32; 22 } 23 24 node *newnode() 25 { 26 int i; 27 node *p=new node; 28 p->flag=0; 29 for (i=0; i<26; i++) 30 p->next[i] = NULL; 31 return p; 32 } 33 34 void insert(node *rt, char s[]) //插入新结点 35 { 36 int i, t; 37 node *p=rt; 38 int len=strlen(s); 39 for (i=0; i<len; i++) 40 { 41 t=s[i]-'a'; 42 if (p->next[t] == NULL) 43 p->next[t]=newnode(); 44 p=p->next[t]; 45 } 46 p->flag=1; 47 } 48 49 void search(node *rt, char *s) //查找 50 { 51 int i, t; 52 node *p=rt; 53 int len=strlen(s); 54 for (i=0; i<len; i++) 55 { 56 t=s[i]-'a'; 57 if (p->next[t] == NULL) 58 return ; 59 p=p->next[t]; 60 } 61 if (p->flag == 1) 62 n--; 63 if (p->flag) 64 p->flag++; 65 } 66 67 void del(node * p) //删除 68 { 69 int i; 70 if(p) 71 { 72 for(i=0;i<26;i++) 73 if(p->next[i]) 74 del(p->next[i]); 75 } 76 free(p); 77 p=NULL; 78 } 79 80 int main() 81 { 82 int m, i; 83 char str[15]; 84 while(cin >> n, n) 85 { 86 node *rt=NULL; 87 cin >> m; 88 rt=newnode(); 89 for (i=0; i<n; i++) 90 { 91 cin >> str; 92 strlwr(str); 93 insert(rt, str); 94 } 95 for (i=0; i<m; i++) 96 { 97 cin >> str; 98 strlwr(str); 99 search(rt, str); 100 } 101 del(rt); 102 cout << n << endl; 103 } 104 return 0; 105 }