可持久化Trie树

代码

const int ChSize=5;
struct PerTrie
{
    int next[maxn*20][ChSize];
    int id,inf[maxn*20];
    void init()
    {
        memset(next[0],0,sizeof(next[0]));
        inf[0]=0;
        id=0;
    }
    int GetId(char c){ return c-'a'; }
    void Insert(int& rt,int pre,char* S,int x) //插入
    {
        rt=++id;
        inf[rt]=inf[pre]+1;
        for(int i=0;i<ChSize;i++) next[rt][i]=next[pre][i]; //把前面的赋给当前
        if(S[x]=='') return;
        Insert(next[rt][GetId(S[x])],next[pre][GetId(S[x])],S,x+1);
    }
    int Query(int le,int ri,char* S) //查询[le,ri]
    {
        for(int i=0;S[i]!='';i++)
        {
            int s=GetId(S[i]);
            le=next[le][s];
            ri=next[ri][s];
        }
        return inf[ri]-inf[le];
    }
}PT;
View Code
原文地址:https://www.cnblogs.com/wust-ouyangli/p/5748482.html