字典树

题目:http://acm.hdu.edu.cn/search.php?action=listproblem

参考:http://blog.csdn.net/cambridgeacm/article/details/7752247

#include<cstdio>
 2 #include<cstring>    //memset函数的头文件
 3 #include<iostream>
 4 using namespace std;
 5 struct node{
 6      int count;
 7      node *next[26]; 
 8      node(){  //初始化数据 
 9          memset(next,NULL,sizeof(next));
10          count=0;
11      }
12 };
13 node *p,*root=new node();
14 void insert(char *s)//插入新单词,即建立字典树
15 {
16      int i,k;
17      for(p=root,i=0;s[i];++i)
18      {
19          k=s[i]-'a';
20          if(p->next[k]==NULL) p->next[k]=new node();//判断是不是新节点,如果是分配创建一个新节点来存贮 ,即root的next域对应的k位置是否为空 
21          p=p->next[k];
22          p->count++;  //记录此字母出现的次数 
23      }
24 }
25 int search(char *s)  //寻找函数 
26 {
27      int i,k;
28      for(p=root,i=0;s[i];++i)
29      {
30          k=s[i]-'a';
31          if(p->next[k]==NULL) break; //一旦查找不到,立即跳出 
32          p=p->next[k];
33      }
34      if(s[i]) return 0;//s[i]!=0表示中间 
35      return p->count;  //返回出现的次数
36 }
37 int main()
38 {
39      char s[11];
40      while(gets(s),*s) insert(s); //一直读入数据,直到遇到空字符串 
41      while(gets(s))
42          printf("%d\n",search(s));
43      return 0;
44 }

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1671

#include <iostream>  
#include <cstdio>  
#include <cstring>  
using namespace std;  
struct node  
{  
    int count;  
    node *next[10];  
    node():count(0){memset(next,0,sizeof(next));}  
};  
node *root;  
node *b[10003];  
int k=0;  
void insert(char *a)  
{  
    int l=strlen(a);  
    node *p=root;  
    int i;  
    for(i=0;i<l;i++)  
    {  
        if(p->next[a[i]-'0']==0)  
        {  
            p->next[a[i]-'0']=new node;  
        }  
        p=p->next[a[i]-'0'];  
        p->count++;  
    }  
    b[k++]=p;  
}  
int check(int n)  
{  
    int i;  
    for(i=0;i<k;i++)  
    {  
        if(b[i]->count!=1)  
            return 1;  
    }  
    return 0;  
}  
void de(node *p)  
{  
    if(p==0)  
        return ;  
    int i;  
    for(i=0;i<10;i++)  
    {  
        de(p->next[i]);  
    }  
    delete p;  
  
}  
int main()  
{  
    int t;  
    scanf("%d",&t);  
    char a[15];  
    while(t--)  
    {  
        root = new node;  
        int n;  
        k=0;  
        scanf("%d",&n);  
        int i;  
        for(i=0;i<n;i++)  
        {  
            scanf("%s",a);  
            insert(a);  
        }  
        if(check(n))  
            printf("NO\n");  
        else  
            printf("YES\n");  
        de(root);  
    }  
    return 0;  
}  
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4287

题目:http://acm.hdu.edu.cn/showproblem.php?pid=2846


你可能感兴趣的:(ACM,HDU)