字典树模板

来源:互联网 发布:安卓微信数据恢复 编辑:程序博客网 时间:2024/06/02 02:38
#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <vector>#include <algorithm>#include <string>#include <iostream>using namespace std;const int MAXN=500000+10;struct trie{    int ch[MAXN<<3][30];    int val[MAXN<<3];    int sz;    void init(){        sz=1;        memset(ch[0],0,sizeof ch[0]);        memset(val,0,sizeof val);    }    int idx(char c){        return c-'a';    }    void insert(const char *s){        int u=0,n=(int)strlen(s);        for(int i=0;i<n;i++){            int c=idx(s[i]);            if(!ch[u][c]){                memset(ch[sz],0,sizeof ch[sz]);                val[sz]=0;                ch[u][c]=sz++;            }            u=ch[u][c];            val[u]++;        }    }    int query(const char *s,int rt,int n,int cur){        int res=0;        if(cur==n){            return val[rt];        }        if(s[cur]=='$'){            for(int i=0;i<26;i++){                if(ch[rt][i]){                    res+=query(s, ch[rt][i], n, cur+1);                }            }        }else{            int c=idx(s[cur]);            if(ch[rt][c]){                return query(s,ch[rt][c],n,cur+1);            }            return 0;        }        return res;    }};