Codechef:Binary Tree/COOK82E(Trie)

传送门

题解:
维护每个时刻完整的二叉树信息即可,具体可以用trie树实现,时间复杂度 O ( n ) O(n)

#include <bits/stdc++.h>
using namespace std;

const int RLEN=1<<18|1;
inline char nc() {
	static char ibuf[RLEN],*ib,*ob;
	(ib==ob) && (ob=(ib=ibuf)+fread(ibuf,1,RLEN,stdin));
	return (ib==ob) ? -1 : *ib++;
}
inline int rd() {
	char ch=nc(); int i=0,f=1;
	while(!isdigit(ch)) {if(ch=='-') f=-1; ch=nc();}
	while(isdigit(ch)) {i=(i<<1)+(i<<3)+ch-'0'; ch=nc();}
	return i*f;
}
inline void W(int x) {
	static int buf[50];
	if(!x) {putchar('0'); return;}
	if(x<0) {putchar('-'); x=-x;}
	while(x) {buf[++buf[0]]=x%10; x/=10;}
	while(buf[0]) putchar(buf[buf[0]--]+'0');
}

const int N=3e6+50, mod=1e9+7, inv=(mod+1)/2;
inline int add(int x,int y) {return (x+y>=mod) ? (x+y-mod) : (x+y);}
inline int dec(int x,int y) {return (x-y<0) ? (x-y+mod) : (x-y);}
inline int mul(int x,int y) {return (long long)x*y%mod;}
inline int power(int a,int b,int rs=1) {for(;b;b>>=1,a=mul(a,a)) if(b&1) rs=mul(rs,a); return rs;}

int n,T,pw[N],iv[N],cnt,sum,cnt2;
int son[N][2],last[N],tot;
inline int add(int d) {sum=add(sum,iv[d]); ++cnt2;}
inline int del(int d) {sum=dec(sum,iv[d]); --cnt2;}
inline int dfs(int p,int lst,int dep) {
	if(last[p]) lst=last[p], dep=0;
	if(!son[p][0]) return lst+dep;
	--cnt;
	del(dfs(son[p][0],lst,dep+1));
	del(dfs(son[p][1],lst,dep+1));
	son[p][0]=son[p][1]=0;
	add(lst+dep);
	return lst+dep;
}
inline void solve() {
	n=rd(), T=0;
	for(int i=1;i<=tot;i++) son[i][0]=son[i][1]=last[i]=0;
	tot=sum=cnt=cnt2=0; ++tot; add(0);
	
	for(int i=1;i<=n;i++) {
		int op=rd();
		if(op==1) {
			int v=rd();
			T+=v;
		} else {
			int pos=1; char ch=nc();
			while(isspace(ch)) ch=nc();
			int lst=0, dep=0;
			while(isalpha(ch)) {
				int c=(ch=='L') ? 0 : 1;
				if(!son[pos][0] && !son[pos][1]) del(lst+dep), ++cnt;
				if(!son[pos][c^1]) add(lst+dep+1), son[pos][c^1]=++tot;
				if(!son[pos][c]) add(lst+dep+1), son[pos][c]=++tot;
				pos=son[pos][c];
				if(last[pos]) lst=last[pos], dep=0;
				else ++dep;
				ch=nc();
			}  
			del(dfs(pos,lst,dep));
			add(last[pos]=(T+1));
		}
		W(add(mul(pw[T+1],sum),dec(cnt,cnt2))), putchar('\n');
	}
}
int main() {
	pw[0]=iv[0]=1;
	for(int i=1;i<N;i++) pw[i]=add(pw[i-1],pw[i-1]);
	for(int i=1;i<N;i++) iv[i]=mul(iv[i-1],inv);
	for(int T=rd();T;T--) solve();
}
发布了553 篇原创文章 · 获赞 227 · 访问量 24万+

猜你喜欢

转载自blog.csdn.net/qq_35649707/article/details/84034589
今日推荐