HDU1251 字典树板子题

题意:中文题,统计以某字符串作为前缀的字符串个数

刚学字典树,理解起来十分简单,就是维护一个多叉树,这里用的是链表版本,后面就用的是数组版本了,个人更喜欢数组版本,这里的链表版本就因为

莫名其妙的错误 C++能过而g++就会MLE 可能是两者管理内存的方式不一样吧

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 using namespace std;
 5 const int maxn=26;
 6 struct Trie{
 7     Trie*next[maxn];
 8     int flag;
 9     Trie(){
10         flag=1;
11         memset(next,0,sizeof(next));
12     }
13 }*root;
14 void insert(char*str){
15     int len=strlen(str);
16     Trie*p=root,*q;
17     for(int i=0;i<len;i++){
18         int id=str[i]-'a';
19         if(p->next[id]==NULL){
20             q=new Trie();
21             p->next[id]=q;
22             p=p->next[id];
23         }
24         else {
25             p=p->next[id];
26             (p->flag)++;
27         }
28     }
29 
30 }
31 int query(char*str){
32     int len=strlen(str);
33     Trie*p=root;
34     for(int i=0;i<len;i++){
35         int id=str[i]-'a';
36         p=p->next[id];
37         if(p==NULL)return 0;
38     }
39     return p->flag;
40 }
41 void Free(Trie*T){
42     if(T==NULL)return ;
43     for(int i=0;i<maxn;i++){
44         if(T->next[i])Free(T->next[i]);
45     }
46     delete(T);
47 }
48 
49 int main(){
50     char temp[15];
51     root=new Trie();
52     while(fgets(temp,15,stdin)&&temp[0]!='\n'){
53              temp[strlen(temp)-1]='\0';
54             // cout<<temp<<endl;    
55            insert(temp);
56     }
57     while(~scanf("%s",temp)){
58         printf("%d\n",query(temp));
59     }
60     Free(root);
61     return 0;
62 }

猜你喜欢

转载自www.cnblogs.com/ttttttttrx/p/10252549.html
今日推荐