zoukankan      html  css  js  c++  java
  • 字典树

     

    字典树,又称单词查找树,Trie树,是一种树形结构,哈希表的一个变种。用于统计,排序和保存大量的字符串(也可以保存其的)。

    优点就是利用公共的前缀来节约存储空间。在这举个简单的例子:比如说我们想储存3个单词,nyist、nyistacm、nyisttc。如果只是

    单纯的按照以前的字符数组存储的思路来存储的话,那么我们需要定义三个字符串数组。但是如果我们用字典树的话,只需要定义

    一个树就可以了。在这里我们就可以看到字典树的优势了。

    基本操作:

    1>建树

    2>查找

    3>删除即释放内存

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    bool flag;
    typedef struct node {
         int cnt;
         struct node *next[10];
         node()
         {
              memset(next,NULL,sizeof(next));
              cnt=0;
         }
    }node ;
    char s[20];
    
    void buildtrid(node *root)//建树。
    {
         node *p=root;
         int l=strlen(s);
         node *tmp;
         for(int i=0;i<l;i++)
         {
              if(p->next[s[i]-'0']==NULL)
              {
                   tmp=new node;
                   p->next[s[i]-'0']=tmp;
              }
              p=p->next[s[i]-'0'];     //插入的单词是否有前缀
              if(p->cnt!=0)
                   flag=false;
         }
         for(int i=0;i<10;i++)//判断插入的单词是否为其他的前缀。。
              if(p->next[i]!=NULL)
              {
                   flag=false;
                   break;
              }
         p->cnt++;
    }
    void del(node *root)//删除多余的节点,并赋值为NULL
    {
         for(int i=0;i<10;i++)
         {
              if(root->next[i])
              {
                   del(root->next[i]);
                   root->next[i]=NULL;
              }
         }
         delete root;
    }
    
    
    int Search(node *root,char *s)//查找
    {  
        node *p=root;  
        for(int i=0;s[i];i++){  
            int x=s[i]-'a';  
            if(p->next[x]==NULL) 
            return 0;  
            p=p->next[x];  
        }  
        return p->num;  
    }  
    
    int main()
    {
         int n,m;
         scanf("%d",&n);
         while(n--)
         {
              flag=true;
              node *root=new node;
              scanf("%d",&m);
              while(m--)
              {
                   scanf("%s",s);
                   if(!flag)continue;
                   buildtrid(root);
              }
              if(flag)
                   printf("YES
    ");
              else
                   printf("NO
    ");
              del(root);
         }
         return 0;
    }
  • 相关阅读:
    【LOJ】#2548. 「JSOI2018」绝地反击
    【LOJ】 #2547. 「JSOI2018」防御网络
    【LOJ】#2513. 「BJOI2018」治疗之雨
    【LOJ】#2546. 「JSOI2018」潜入行动
    【LOJ】#2479. 「九省联考 2018」制胡窜
    【LOJ】#2511. 「BJOI2018」双人猜数游戏
    【LOJ】#2493. 「BJOI2018」染色
    【LOJ】#2492. 「BJOI2018」二进制
    【LOJ】#2512. 「BJOI2018」链上二次求和
    使用POI读取excel文件内容
  • 原文地址:https://www.cnblogs.com/WDKER/p/5501774.html
Copyright © 2011-2022 走看看