zoukankan      html  css  js  c++  java
  • Trie 树

    trie树就是字典树,就是花时间为空间的一种高效查找的数据结构

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<cstdlib>
    
    const int maxn=26;
    
    int n,m;
    char s[51];
    
    typedef struct Trienode
    {
        bool isStr,iscove;
        int step;
        struct Trienode *next[maxn];
    }Trie;
    
    int sum;
    
    
    void insert_Trie(Trie *root, const char *s)
    {
        if (root==NULL || *s=='') return;
        Trie *p=root;
        while (*s!='')
        {
            if (p->next[*s-'a']==NULL)
            {
                Trie *temp=new(Trie);
                for (int i=0;i<maxn;i++) temp->next[i]=NULL;
                temp->isStr=false;
                temp->iscove=true;
                temp->step=p->step+1;
                p->next[*s-'a']=temp;
                p=p->next[*s-'a'];
            }
            else
            {
                if (sum<(p->next[*s-'a'])->step) sum=(p->next[*s-'a'])->step;
                p=p->next[*s-'a'];
            }
            s++;
        }
        p->isStr=true;
        p->iscove=true;
    }
    
    bool search_Trie(Trie *root, const char *s)
    {
        Trie *p=root;
        while (p!=NULL && *s!='')
        {
            p=p->next[*s-'a'];
            s++;
        }
        return (p!=NULL && p->isStr==true);
    }
    
    void del_Trie(Trie *root)
    {
        for (int i=0;i<maxn;i++)
        {
            if (root->next[i]!=NULL)
            del_Trie(root->next[i]);
        }
        free(root);
    }
    
    
    int main()
    {
        freopen("in.txt","r",stdin);
        
        while(scanf("%d",&n)!=EOF)
        {
            Trie *root=new (Trie);
            for (int i=0;i<maxn;i++) root->next[i]=NULL;
            root->isStr=false;
            root->iscove=false;
            root->step=0;
            sum=0;
            for (int i=0;i<n;i++)
            {
                scanf("%s",&s);
                insert_Trie(root,s);
            }
            printf("%d
    ",sum);
            del_Trie(root);
        }
        fclose(stdin);
        return 0;
    }

    这个代码的内存消耗很高,而且速度都不怎么快,不过依然可以处理很多题目了,但是其还是可以用数组来实现

    下面是数组实现

    #include<map>
    #include<set>
    #include<queue>
    #include<cmath>
    #include<vector>
    #include<cstdio>
    #include<string>
    #include<cstring>
    #include<cstdlib>
    #include<iostream>
    #include<algorithm>
    #define  inf 0x0f0f0f0f
    
    using namespace std;
    
    const double pi=acos(-1.0);
    const double eps=1e-8;
    typedef pair<int,int>pii;
    
    const int maxn=500000;
    
    struct Trie
    {
        bool isStr;
        int next;
    }trie[maxn][26];
    
    int main()
    {
        freopen("in.txt","r",stdin);
        int cur,len;
        int alloc=1,n,m;
        char s[51];
        for (int i=0;i<500000;i++)
        for (int j=0;j<26;j++)
        {
            trie[i][j].isStr=false;
            trie[i][j].next=-1;
        }
        scanf("%d",&n);
        for (int i=0;i<n;i++)
        {
            scanf("%s",s);
            len=strlen(s);
            cur=0;
            for (int j=0;j<len;j++)
            {
                if (trie[cur][s[j]-'a'].next==-1)
                {
                    trie[cur][s[j]-'a'].next=alloc;
                    alloc++;
                }
                if (j==len-1) trie[cur][s[j]-'a'].isStr=true;
                cur=trie[cur][s[j]-'a'].next;
            }
        }
    
        scanf("%d",&m);
        for (int i=0;i<m;i++)
        {
            scanf("%s",s);
            cur=0;
            int j;
            len=strlen(s);
            for (j=0;j<len;j++)
            {
                if (trie[cur][s[j]-'a'].next==-1) {printf("NO
    ");break;}
                if (j==len-1)
                {
                    if (trie[cur][s[j]-'a'].isStr) printf("YES
    ");
                    else printf("NO
    ");
                    break;
                }
                cur=trie[cur][s[j]-'a'].next;
            }
        }
        fclose(stdin);
        return 0;
    }

    这样Trie树就算这样了

    至少做到我努力了
  • 相关阅读:
    python和搜索
    Flask---ajax(jquery)交互
    Flask--修改默认的static文件夹的方法
    Flask设计带认证token的RESTful API接口[翻译]
    Python 和 Flask实现RESTful services
    等差数列偶数被除2删除后的恢复问题(2018小马智行秋招计算机视觉第三道编程题)
    Leetcode 140 单词拆分II: 字符串s在字典wordDict中有多少种拆分方法。
    LeetCode 139 单词拆分:字符串s能否分割为字符串数组words(wordDict)中字符串的组合?(某未来公司面试题目)
    ROS时间概念总结:ros::Time、ros::Duration、定时器ros::Timer&ros::Rate
    ++i、i++、i+=1、i=i+1的区别
  • 原文地址:https://www.cnblogs.com/chensunrise/p/3681157.html
Copyright © 2011-2022 走看看