我想死。。。

P2414 [NOI2011] 阿狸的打字机

**~~表示看不懂~~**
by 花满楼_落枫 @ 2019-01-20 18:14:54


@[61314w](/space/show?uid=116608) ###### 没事,我已经调了两个半小时了,前一秒终于调出来了,变量名重复了
by Froggy @ 2019-01-20 18:24:05


这是我AC的代码: ```cpp #include<iostream> #include<queue> #include<algorithm> #include<cstdio> using namespace std; #define N 100010 string a; queue<int> q; int n,cnt=0,tot=0,num=0,len,tt=0,ttot=0; int head[N],dfn[N],size[N],ans[N],here[N]; struct node{ int ch[26],nxt; int fa; }tree[N<<2]; struct Ask{ int x,y,index; }ask[N]; struct Edge{ int to,nxt; }edge[N]; struct Xian_duan_shu{ int val,l,r; }s[N<<2]; void build_tree(int i,int l,int r){ s[i].l=l; s[i].r=r; if(l==r){ s[i].val=0; return; } int mid=(l+r)>>1; build_tree(i*2,l,mid); build_tree(i*2+1,mid+1,r); } void add(int a,int b){ cnt++; edge[cnt].to=b; edge[cnt].nxt=head[a]; head[a]=cnt; } bool comp(Ask a,Ask b){ return a.y<b.y; } void insert(){ int u=0; for(int i=0;i<len;i++){ if(a[i]=='B'){ u=tree[u].fa; } else if(a[i]=='P'){ here[++tt]=u; } else{ int c=a[i]-'a'; if(!tree[u].ch[c]){ tree[u].ch[c]=++tot; tree[tot].fa=u; } u=tree[u].ch[c]; } } } void bfs(){ for(int i=0;i<26;i++){ int v=tree[0].ch[i]; if(v){ tree[v].nxt=0; q.push(v); } } while(!q.empty()){ int u=q.front(); q.pop(); for(int i=0;i<26;i++){ int v=tree[u].ch[i]; if(v){ tree[v].nxt=tree[tree[u].nxt].ch[i]; q.push(v); } else tree[u].ch[i]=tree[tree[u].nxt].ch[i]; } } } void dfs(int u){ dfn[u]=++ttot;size[u]=1; for(int i=head[u];i;i=edge[i].nxt){ int v=edge[i].to; if(u==v)continue; dfs(v); size[u]+=size[v]; } } int to_ans(int i,int l,int r){//子树求和 if(s[i].l==l&&s[i].r==r){ return s[i].val; } int mid=(s[i].l+s[i].r)>>1; if(r<=mid) return to_ans(i*2,l,r); if(l>mid) return to_ans(i*2+1,l,r); return to_ans(i*2,l,mid)+to_ans(i*2+1,mid+1,r); } void _plus(int i,int x,int dis){ if(s[i].l==s[i].r){ s[i].val+=dis; return; } int mid=(s[i].l+s[i].r)>>1; if(x<=mid)_plus(i*2,x,dis); else _plus(i*2+1,x,dis); s[i].val=s[i*2].val+s[i*2+1].val; } void get_ans(){ int point=1,tot1=0; int u=0; for(int i=0;i<len;i++){ if(a[i]=='P'){ tot1++; while(ask[point].y==tot1){ int x1=ask[point].x; ans[ask[point].index]=to_ans(1,dfn[here[x1]],dfn[here[x1]]+size[here[x1]]-1); point++; } } else if(a[i]=='B'){ _plus(1,dfn[u],-1); u=tree[u].fa; } else{ int c=a[i]-'a'; u=tree[u].ch[c]; _plus(1,dfn[u],1); } } } int main(){ cin>>a; len=a.length(); insert(); cin>>n; for(int i=1;i<=n;i++){ cin>>ask[i].x>>ask[i].y; ask[i].index=i; } sort(ask+1,ask+n+1,comp); bfs(); for(int i=0;i<=tot;i++){ add(tree[i].nxt,i); } dfs(0); build_tree(1,1,ttot); get_ans(); for(int i=1;i<=n;i++){ cout<<ans[i]<<endl; } return 0; } ```
by Froggy @ 2019-01-20 18:24:40


楼主放出来代码不怕有人抄袭吗
by jc2018 @ 2019-01-20 18:28:13


@[Froggy](/space/show?uid=100285)
by jc2018 @ 2019-01-20 18:28:28


@[61314w](/space/show?uid=116608) 表示今天刚学,但内容还没全懂,用代码去实现更别提了 本蒟蒻才刚学会最小生成树~~我才不会告诉你我是照着老师的代码敲出来的~~ 不过并查集我真是会写了,最小生成树也差不多会写了
by qwertylzx·破祥 @ 2019-01-20 18:28:59


@[jc2018](/space/show?uid=100699) # 不怕 ##### ~~因为我就是抄的~~(不过不是Ctrl+C,Ctrl+V,代码还是我自己写的)
by Froggy @ 2019-01-20 18:33:30


@[Froggy](/space/show?uid=100285) dalao太巨了
by wxw25 @ 2019-01-20 18:46:15


@[Froggy](/user/100285) dalao太巨了才调了两个半小时 我已经调了三个半小时了
by zhoukangyang @ 2020-08-12 20:07:44


好吧, 我犯了一个sb错误
by zhoukangyang @ 2020-08-12 20:17:40


|