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 }