sdut 1500 Message Flood(Trie树)

题目:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1500

View Code
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<stdlib.h>
 5 using namespace std;
 6 struct node
 7 {
 8     int flag;
 9     node *next[26];
10 };
11 int num;
12 node *build()
13 {
14     node *p;
15     int i;
16     p=new node;
17     p->flag=0;
18     for(i=0;i<26;i++)
19     p->next[i]=NULL;
20     return p;
21 }
22 void insert(node *p, char *s)
23 {
24     int len,i,t;
25     len=strlen(s);
26     for(i=0;i<len;i++)
27     {
28         if(s[i]>='A'&&s[i]<='Z')
29         t=s[i]-'A';
30         else
31         t=s[i]-'a';
32         if(p->next[t]==NULL)
33             p->next[t]=build();
34         p=p->next[t];
35     }
36     p->flag=1;
37 }
38 int search(node *p,char *s)
39 {
40     int t,i,len;
41     len=strlen(s);
42     for(i=0;i<len;i++)
43     {
44         if(s[i]>='A'&&s[i]<='Z')
45         t=s[i]-'A';
46         else
47         t=s[i]-'a';
48         if(p->next[t]==NULL)
49         return 0;
50         p=p->next[t];
51     }
52     if(p->flag==1)
53     {
54          num++;
55          p->flag=-1;
56          return 1;
57     }
58     return 0;
59 }
60 void deal(node *p)
61 {
62     int i;
63     if(p)
64     {
65         for(i = 0 ;i < 26 ; i++)
66         if(p->next[i])
67         deal(p->next[i]);
68     }
69     free(p);
70     p=NULL;
71 }
72 int main()
73 {
74     int m,n,i,k;
75     char str[25];
76     node *p;
77     while(~scanf("%d",&m))
78     {
79         if(m==0)
80         break;
81         scanf("%d",&n);
82         p=build();
83         num=0;
84         for(k=1;k<=m;k++)
85         {
86             scanf("%s",str);
87             insert(p,str);
88         }
89         while(n--)
90         {
91             scanf("%s",str);
92             search(p,str);
93         }
94         printf("%d\n",m-num);
95         deal(p);
96     }
97     return 0;
98 }
原文地址:https://www.cnblogs.com/wanglin2011/p/2636974.html