站外题求调,悬关
  • 板块题目总版
  • 楼主sdyzpf
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/7/22 19:58
  • 上次更新2024/7/22 20:59:37
查看原帖
站外题求调,悬关
174477
sdyzpf楼主2024/7/22 19:58

#include<bits/stdc++.h>
#define int long long
using namespace std;
int tot=0,n,q,op[100005],cd1[100005],cd2[100005],cd3[100005];
int trie[200005][26],st[200005][18];
int v[200005],len[200005],dfn[200005],siz[200005],cnt;
string s[200005],T;
namespace seg{
	#define ls p*2
	#define rs p*2+1
	struct node{
		int l,r,sum,tag;
	}t[800025];
	inline void pushup(int p){t[p].sum=t[ls].sum+t[rs].sum;}
	inline void pushdown(int p){
		if(!t[p].tag) return;
		t[ls].tag+=t[p].tag;
		t[rs].tag+=t[p].tag;
		t[ls].sum+=(t[ls].r-t[ls].l+1)*t[p].tag;
		t[rs].sum+=(t[rs].r-t[rs].l+1)*t[p].tag;
		t[p].tag=0;
	}
	void build(int p,int l,int r){
		t[p].l=l,t[p].r=r,t[p].sum=t[p].tag=0;
		if(l==r) return;
		int mid=(l+r)/2;
		build(ls,l,mid);
		build(rs,mid+1,r);
		pushup(p);
	}
	void modify(int p,int l,int r,int val){
		if(l<=t[p].l&&t[p].r<=r){
			t[p].tag+=val;
			t[p].sum+=val*(t[p].r-t[p].l+1);
			return;
		}
		pushdown(p);
		int mid=(t[p].l+t[p].r)/2;
		if(l<=mid) modify(ls,l,r,val);
		if(r>mid) modify(rs,l,r,val);
		pushup(p);
	}
	void delet(int p,int x){
		if(t[p].l==t[p].r){
			t[p].tag=t[p].sum=0;
			return;
		}
		pushdown(p);
		int mid=(t[p].l+t[p].r)/2;
		if(x<=mid) delet(ls,x);
		else delet(rs,x);
		pushup(p);
	}
	int query(int p,int x){
		if(t[p].l==t[p].r) return t[p].sum;
		pushdown(p);
		int mid=(t[p].l+t[p].r)/2;
		if(x<=mid) return query(ls,x);
		return query(rs,x);
	}
}
namespace Trie{
	inline void insert(int p){
		int u=0;
		for(int i=0;i<s[p].length();i++){
			int id=s[p][i]-'a';
			if(!trie[u][id]){
				trie[u][id]=++tot;
				st[trie[u][id]][0]=u;
				u=tot;
				for(int j=1;j<=17;j++)
					st[u][j]=st[st[u][j-1]][j-1];
			}
			else u=trie[u][id];
		}
		v[p]=u;
	}
	inline void rins(int p){
		int u=p;
		for(int i=0;i<T.length();i++){
			int id=T[i]-'a';
			if(!trie[u][id]){
				trie[u][id]=++tot;
				st[trie[u][id]][0]=u;
				u=tot;
				for(int j=1;j<=17;j++)
					st[u][j]=st[st[u][j-1]][j-1];
			}
			else u=trie[u][id];
		}
		v[n]=u;
	}
	void dfs(int u){
		dfn[u]=++cnt,siz[u]=1;
		for(int i=0;i<26;i++)
			if(trie[u][i]){
				dfs(trie[u][i]);
				siz[u]+=siz[trie[u][i]];
			}
	}
}
inline int calc(int x,int k){
	int dis=len[x]-k;
	int u=v[x];
	for(int i=17;i>=0;i--)
		if(dis>=(1<<i)){
			dis-=1<<i;
			u=st[u][i];
		}
	return u;
}
signed main(){
//	freopen("book.in","r",stdin);
//	freopen("book.out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++) cin>>s[i];
	for(int i=1;i<=n;i++) Trie::insert(i);
	for(int i=1;i<=n;i++) len[i]=s[i].length();
	cin>>q;
	for(int i=1;i<=q;i++){
		cin>>op[i]>>cd1[i];
		if(op[i]==1) cin>>cd2[i]>>cd3[i];
		else if(op[i]==2){
			cin>>cd2[i]>>T;
			n++;cd3[i]=n;
			len[n]=cd2[i]+T.length();
			Trie::rins(calc(cd1[i],cd2[i]));
		}
	}
	Trie::dfs(0);
	seg::build(1,1,tot+1);
	for(int i=1;i<=q;i++){
		if(op[i]==1){
			int to=calc(cd1[i],cd2[i]);
			seg::modify(1,dfn[to],dfn[to]+siz[to]-1,cd3[i]);	
		}
		else if(op[i]==2) seg::delet(1,dfn[v[cd3[i]]]);
		else cout<<seg::query(1,dfn[v[cd1[i]]])<<'\n';
	}
	return 0;
}
2024/7/22 19:58
加载中...