社区讨论

10pts dfs写法

P5658[CSP-S 2019] 括号树参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mm35ix4r
此快照首次捕获于
2026/02/26 15:38
2 周前
此快照最后确认于
2026/02/27 21:15
2 周前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
const int N=5e5;
char a[N];
char s[N];
int f[N];
int nxt[N],to[N],head[N];
long long sum[N];
long long lst[N];
long long ans=0;
int top,cnt;
void edge_add(int u,int v){
    nxt[++cnt]=head[u];
	head[u]=cnt;
	to[cnt]=v;
}
inline void dfs(int x){
	int tmp=0;
	if(a[x]==')'){
		if(top){
			tmp=s[top];
			lst[x]=lst[f[tmp]]+1;
			--top;
		}
	}
	else if(a[x]=='(') s[++top]=x;
	sum[x]=sum[f[x]]+lst[x];
	for(int i=head[x];i;i=nxt[i]) dfs(to[i]);
	if(tmp!=0) s[++top]=tmp;
	else if(top) --top;
}
signed main(){
    scanf("%lld",&n);
    scanf("%s",a+1);
    for (int i=2;i<=n;++i){
        scanf("%lld",&f[i]);
        edge_add(f[i],i);
    }
    dfs(1);
    for (long long i=1;i<=n;++i){
        ans^=sum[i]*i;
    }
    cout<<ans;
    return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...