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=='\0') return;
    Trie *p=root;
    while (*s!='\0')
    {
        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!='\0')
    {
        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\n",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\n");break;}
            if (j==len-1)
            {
                if (trie[cur][s[j]-'a'].isStr) printf("YES\n");
                else printf("NO\n");
                break;
            }
            cur=trie[cur][s[j]-'a'].next;
        }
    }
    fclose(stdin);
    return 0;
}

这样Trie树就算这样了

posted @ 2014-04-22 19:13  Hust_BaoJia  阅读(187)  评论(0编辑  收藏  举报
努力