• 【BZOJ3881】【Coci2015】—Divljak(Ac自动机+树状数组)


    传送门

    相当于吗每次把TTAcAc自动机上跑
    把经过的所有点在failfail树上的祖先不重复的加一
    单点询问权值

    AcAc自动机上走,把所有经过的点按照dfndfn排序
    把相邻两点的LcaLca到根减一即可

    由于链加是O(log2n)O(log^2n)
    转成单点加,子树求和可以做到O(nlogn)O(nlogn)

    因为我AcAc自动机根是00号节点
    所以树剖的时候要把初始重儿子设成1-1

    结果就这样还过了除了最后一个点以外所有

    #include<bits/stdc++.h>
    using namespace std;
    const int RLEN=1<<20|1;
    inline char gc(){
        static char ibuf[RLEN],*ib,*ob;
        (ob==ib)&&(ob=(ib=ibuf)+fread(ibuf,1,RLEN,stdin));
        return (ob==ib)?EOF:*ib++;
    }
    #define gc getchar
    inline int read(){
        char ch=gc();
        int res=0,f=1;
        while(!isdigit(ch))f^=ch=='-',ch=gc();
        while(isdigit(ch))res=(res+(res<<2)<<1)+(ch^48),ch=gc();
        return f?res:-res;
    }
    #define ll long long
    #define re register
    #define pii pair<int,int>
    #define pic pair<int,char>
    #define fi first
    #define se second
    #define pb push_back
    #define cs const
    #define bg begin
    #define poly vector<int>
    #define chemx(a,b) ((a)<(b)?(a)=(b):0)
    #define chemn(a,b) ((a)>(b)?(a)=(b):0)
    cs int N=2000006;
    namespace Ac{
    	int nxt[N][26],fail[N],tot,ed[N];
    	vector<int> e[N];
    	inline void insert(char *s,int id){
    		int p=0;
    		for(int i=1,len=strlen(s+1);i<=len;i++){
    			int c=s[i]-'a';
    			if(!nxt[p][c])nxt[p][c]=++tot;
    			p=nxt[p][c];
    		}
    		ed[id]=p;
    	}
    	queue<int> q;
    	inline void buildfail(){
    		for(int i=0;i<26;i++)
    		if(nxt[0][i])q.push(nxt[0][i]);
    		while(!q.empty()){
    			int p=q.front();q.pop();
    			for(int c=0;c<26;c++){
    				int v=nxt[p][c];
    				if(v)fail[v]=nxt[fail[p]][c],q.push(v);
    				else nxt[p][c]=nxt[fail[p]][c];
    			}
    		}
    	}
    	int in[N],out[N],dfn,siz[N],son[N],top[N],fa[N],dep[N],idx[N];	
    	namespace Tr{
    		int tr[N];
    		#define lb(x) (x&(-x))
    		inline void update(int p,int k){
    			for(;p<=dfn;p+=lb(p))tr[p]+=k;
    		}
    		inline int ask(int p,int res=0){
    			for(;p;p-=lb(p))res+=tr[p];return res;
    		}
    		inline int query(int l,int r){
    			return ask(r)-ask(l-1);
    		}
    	}
    	void dfs1(int u){
    		siz[u]=1,son[u]=-1;
    		for(int &v:e[u]){
    			fa[v]=u,dep[v]=dep[u]+1;
    			dfs1(v),siz[u]+=siz[v];
    			if(son[u]==-1||siz[v]>siz[son[u]])son[u]=v;
    		}
    	}
    	void dfs2(int u,int tp){
    		top[u]=tp,in[u]=++dfn,idx[dfn]=u;
    		if(son[u]!=-1)dfs2(son[u],tp);
    		for(int &v:e[u]){
    			if(v==son[u])continue;
    			dfs2(v,v);
    		}
    		out[u]=dfn;
    	}
    	inline int Lca(int u,int v){
    		while(top[u]!=top[v]){
    			if(dep[top[u]]<dep[top[v]])swap(u,v);
    			u=fa[top[u]];
    		}
    		return dep[u]>dep[v]?v:u;
    	}
    	inline void build(){
    		buildfail();
    		for(int i=1;i<=tot;i++)e[fail[i]].pb(i);
    		dfs1(0),dfs2(0,0);
    	}
    	inline bool comp(int a,int b){
    		return in[a]<in[b];
    	}
    	int stk[N];
    	inline void update(char *s){
    		int p=0,top=0;
    		for(int i=1,len=strlen(s+1);i<=len;i++){
    			int c=s[i]-'a';
    			p=nxt[p][c];
    			stk[++top]=in[p];
    			Tr::update(in[p],1);
    		}
    		sort(stk+1,stk+top+1);
    		for(int i=2;i<=top;i++){
    			Tr::update(in[Lca(idx[stk[i]],idx[stk[i-1]])],-1);
    		}
    	}
    	inline int query(int id){
    		int p=ed[id];
    		return Tr::query(in[p],out[p]);
    	}
    }
    char s[N];
    int n,q;
    int main(){
    	n=read();
    	for(int i=1;i<=n;i++){
    		scanf("%s",s+1);
    		Ac::insert(s,i);
    	}
    	Ac::build();q=read();
    	for(int i=1;i<=q;i++){
    		int op=read();
    		if(op==1){
    			scanf("%s",s+1);
    			Ac::update(s);
    		}
    		else{
    			int x=read();
    			cout<<Ac::query(x)<<'
    ';
    		}
    	}
    }
    
  • 相关阅读:
    关注底层:IL部分
    腾讯与敏捷开发(zz)
    关于腾讯敏捷框架TAPD (ZZ)
    最新苹果官方iphone sdk 与 xcode 下载网址汇总
    松山湖之行
    [zz]在C#程序中实现插件架构
    华为与敏捷(zz)
    OK6410 tftp下载内核、文件系统以及nand flash地址相关整理、总结
    T400换风扇解决开机fan error问题
    校园故事一个非典型工科男的电子设计之路(整理版)
  • 原文地址:https://www.cnblogs.com/stargazer-cyk/p/12328449.html
Copyright © 2020-2023  润新知