85pts求助 8~10WA 18~20AC
查看原帖
85pts求助 8~10WA 18~20AC
489661
lateworker楼主2023/7/9 08:28

自己想的思路, 代码如下

#include <iostream>
#include <vector>
#include <stack>
using namespace std;
#define int long long
const int N = 5e5+10;
int n, val[N], num[N], cnt[N], tot[N], lft[N];
stack<int> stk;
vector<int> g[N];
void dfs(int u, int p) {
	if(val[u] == 0) {
		stk.push(u);
		if(val[p] and stk.size() == tot[lft[p]]) cnt[u] = cnt[lft[p]] + 1;
		else cnt[u] = 0;
		tot[u] = stk.size();
	} else if(!stk.empty()) {
		int v = stk.top();
		stk.pop();
		lft[u] = v;
		num[u] = cnt[v] + 1;
	}
	for(int v : g[u]) if(v != p) {
		dfs(v, u);
	}
	if(!stk.empty() and stk.top() == u) stk.pop();
}
int ans;
void getans(int u, int p, int s) {
	s += num[u];
	ans ^= u*s;
	for(int v : g[u]) if(v != p) {
		getans(v, u, s);
	}
}
main() {
	cin>>n;
	for(int i=1;i<=n;++i) {
		char c;
		cin>>c;
		if(c == '(') val[i] = 0;
		else val[i] = 1;
	}
	for(int i=2;i<=n;++i) {
		int x;
		cin>>x;
		g[x].push_back(i);
	}
	dfs(1, 0);
	getans(1, 0, 0);
	cout<<ans;
	return 0;
}
2023/7/9 08:28
加载中...