厌氧代码求调
查看原帖
厌氧代码求调
482130
Kx_Triumphs楼主2024/8/10 16:37

代码本地能直接过#8,#9,#10数据,开O2提交后却会WA掉这几个点,不开O2就能过掉。有没有大佬能解释一下这一现象如何解决?

#include<iostream>
#include<stack>
#include<vector>
using namespace std;
typedef long long ll;
const int N=7e5+5;
int n;
vector <int> e[N];
int f[N];
struct dot{
	char c;
	int id;
}c[N];
stack <dot> stk;
//		last	connect
ll dp[N],lst[N],con[N];
void dfs(int x,int fa){
	dot t;
	if(!stk.empty()&&stk.top().c=='('&&c[x].c==')'){
		t=stk.top();
		stk.pop();
		lst[x]=t.id;
		dp[x]=dp[fa]+1+con[f[lst[x]]];
		con[x]=con[f[lst[x]]]+1;
	}
	else{
		dp[x]=dp[f[x]];
		stk.push(c[x]);
	}
	for(int i=0;i<e[x].size();i++){
		int y=e[x][i];
		dfs(y,x);
	}
	if(c[x].c==')'){
		stk.push(t);
	}
	else{
		stk.pop();
	}
}
int main(){
	//freopen("brackets.in","r",stdin);
//	freopen("brackets.out","w",stdout);
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>c[i].c;
		c[i].id=i;
	}
	for(int i=2;i<=n;i++){
		scanf("%d",&f[i]);
		e[f[i]].push_back(i);
	}
	dfs(1,0);
	ll ans=1*dp[1];
	for(int i=2;i<=n;i++){
		ll t=i*dp[i];
		ans^=t;
	}
	cout<<ans;
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}
/*
4
()()
1 2 3

ans:3
*/
/*
6
(())()
1 2 3 4 5

ans:4
*/
/*
5
(()()
1 1 2 2
*/
2024/8/10 16:37
加载中...