可持久化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]=='\0') 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]!='\0';i++) { int s=GetId(S[i]); le=next[le][s]; ri=next[ri][s]; } return inf[ri]-inf[le]; } }PT;