Trie模板

struct Trie
{
    int ch[maxnode][sigma_size];
    int sz;
    int cont[maxnode];
    Trie() {memset(ch,0,sizeof ch);memset(cont,0,sizeof cont);sz=1;}
    int idx(char c) {return c-'a';}

    void insert(char *s)
    {
        int u=0,l=strlen(s);
        for(int i=0;i<l;++i){
            int c=idx(s[i]);
            if(!ch[u][c]){
                ch[u][c]=sz++;
            }
            u=ch[u][c];
            cont[u]++; //字符串的最后一个节点记录信息


        }
    }

    int query(char *s)
    {
        int u=0,l=strlen(s);
        for(int i=0;i<l;++i){
            int c=idx(s[i]);
            if(!ch[u][c]) return 0;
            u=ch[u][c];
        }
        return cont[u];
    }
}T;




#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#define maxnode 10000
#define sigma_size 26
using namespace std;

struct tree
{
    int num;
    struct tree* next[sigma_size];
};
struct tree *root;
void insert(char *s)
{
    struct tree *p=root,*q;
    int l=strlen(s);
    for(int i=0;i<l;++i){
        int c=s[i]-'a';
        if(p->next[c]==NULL){
            q=(struct tree* )malloc(sizeof(struct tree));
            q->num=1;
            for(int j=0;j<sigma_size;++j){
                q->next[j]=NULL;
            }
            p->next[c]=q;
            p=p->next[c];
        }
        else{
            p=p->next[c];
            p->num++;
        }

    }
}

int query(char *s)
{
    struct tree *p=root;
    int l=strlen(s);
    for(int i=0 ;i<l;++i){
        int c=s[i]-'a';
        p=p->next[c];
        if(p==NULL) return 0;

    }
    return p->num;
}

void deal(struct tree * p)
{
    if(p==NULL) return;
    for(int i=0;i<sigma_size;++i){
        if(p->next[i]!=NULL){
            deal(p->next[i]);
        }
    }
    free(p);
    return ;
}
root=(struct tree* )malloc(sizeof(struct tree));
for(int i=0;i<sigma_size;++i){
    root->next[i]=NULL;
}
root->num=0;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值