题解:
维护每个时刻完整的二叉树信息即可,具体可以用trie树实现,时间复杂度
O
(
n
)
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();
}