10 pts WA 求助
查看原帖
10 pts WA 求助
363036
chlchl楼主2023/8/9 21:15

怎么这么短的代码我没看出来哪里错了。。。。

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

const int N = 5e5 + 10;
int n, a[N];
int id, head[N << 1], to[N << 1], nxt[N << 1];
ll f[N], g[N];
char s[N];
stack<int> st;

void add(int u, int v){
	to[++id] = v;
	nxt[id] = head[u], head[u] = id;
}

void dfs(int u, int fa){
	int del = 0;
	if(a[u] == 1){
		if(!st.empty()){
			del = st.top();
			g[u] = g[del] + 1;
			st.pop();
		}
	}
	else if(a[u] == -1)
		st.push(u);
	f[u] = f[fa] + g[u];
	for(int i=head[u];i;i=nxt[i]){
		int v = to[i];
		if(v == fa)
			continue;
		dfs(v, u);
	}
	if(del)
		st.push(del);
	else if(!st.empty())
		st.pop();
}

int main(){
	scanf("%d", &n);
	scanf("%s", s + 1);
	for(int i=1;i<=n;i++)
		a[i] = (s[i] == '(' ? -1 : 1); 
	for(int i=2,p;i<=n;i++){
		scanf("%d", &p);
		add(p, i);
	}
	dfs(1, 1);
	ll ans = 0;
	for(int i=1;i<=n;i++)
		ans ^= 1ll * i * f[i];
	printf("%lld\n", ans);
	return 0;
}
2023/8/9 21:15
加载中...