字典树模板

//字典树
//定义:注意任意字符需要130,01字典树只需要2
struct Node{int last; int sum; int son[26];}trie[1000000];
//插入:last参数标记在插入子串的末尾,sum记录插入时经过该节点次数
void insert(char *s){
    for(int l=strlen(s),x=0,i=0;i<l;i++){
        if(!trie[x].son[s[i]-'a'])trie[x].son[s[i]-'a']=++cnt;
        x=trie[x].son[s[i]-'a'];
        if(trie[x].last)flag=1;
        if(i==l-1){
            trie[x].last++;
            if(trie[x].sum)flag=1;
        }trie[x].sum++;
    }
}
//查找:返回多少串以该串为前缀,可以利用last参数返回该串的前缀数目
int find(char *s){
    for(int l=strlen(s),x=0,i=0;i<l;i++){
        if(!trie[x].son[s[i]-'a'])return 0;
        x=trie[x].son[s[i]-'a'];
        if(i==l-1)return trie[x].sum;
    }
}
//初始化
void del(int x){
    for(int i=0;i<26;i++)
    if(trie[x].son[i]){
        del(trie[x].son[i]);
        trie[x].son[i]=0;
    }trie[x].sum=trie[x].last=0;
}

  

原文地址:https://www.cnblogs.com/forever97/p/4935020.html