代码本地能直接过#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
*/