可持久化AC自动机

其实就是可持久化线段树的模板题
线段树不会看这里

#include
const int N=1000005;
using namespace std;
int a[N],n,m,q,rt[N*20];
int lc[N*20],rc[N*20],val[N*20],cnt;
int rd(){
    register int f=1,x=0;register char ch;
    do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0' or ch>'9');
    do{x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}while(ch>='0' and ch<='9');
    return f*x;
}
void build(int &o,int l,int r){
    o=++cnt;
    if(l==r){
        val[o]=a[l];
        return;
    }
    int mid=(l+r)>>1;
    build(lc[o],l,mid);build(rc[o],mid+1,r);
}
void insert(int &o,int pre,int l,int r,int q,int v){
    o=++cnt;lc[o]=lc[pre];rc[o]=rc[pre];val[o]=val[pre];
    if(l==r){
        val[o]=v;
        return;
    }
    int mid=(l+r)>>1;
    if(q<=mid)insert(lc[o],lc[pre],l,mid,q,v);
    else insert(rc[o],rc[pre],mid+1,r,q,v);
}
int query(int o,int l,int r,int q){
    if(l==r)return val[o];    
    int mid=(l+r)>>1;
    if(q<=mid)
        return query(lc[o],l,mid,q);
    else return query(rc[o],mid+1,r,q);
}
int main(){
    n=rd();m=rd();
    for(int i=1;i<=n;i++)
        a[i]=rd();
    build(rt[0],1,n);
    for(int i=1;i<=m;i++){
        int pre=rd(),opt=rd(),x=rd();
        if(opt==1){
            int v=rd();
            insert(rt[i],rt[pre],1,n,x,v);
        }else{
            printf("%d\n",query(rt[pre],1,n,x));
            rt[i]=rt[pre];
        }
    }
}

你可能感兴趣的:(数据结构,学习笔记,线段树,可持久化)