zrq495
www.zrq495.com

简单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 }
posted on 2012-08-14 14:23  zrq495  阅读(178)  评论(0编辑  收藏  举报