社区讨论
85pts求问!!玄关
P5658[CSP-S 2019] 括号树参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mhz4anjk
- 此快照首次捕获于
- 2025/11/15 01:14 4 个月前
- 此快照最后确认于
- 2025/11/16 13:49 4 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n;
int ans;
char s[500005];
vector<int> e[500005];
int fa[500005];
int lst[500005];
int sum[500005];
void read(int &k){
int x=0;
char a=getchar();
while(a<48||a>57)
a=getchar();
while(a>=48&&a<=57){
x=x*10+a-48;
a=getchar();
}
k=x;
}
void write(int k){
if(k>9) write(k/10);
putchar(k%10+48);
}
int st[500005];
int top=0;
void dfs(int k){
int ttop=top;
if(top==0){
if(s[k]=='(')
st[++top]=k;
}
else{
if(s[k]==')'){
lst[k]=lst[fa[st[top]]]+1;
top--;
}
else st[++top]=k;
}
sum[k]=sum[fa[k]]+lst[k];
for(int i=0;i<e[k].size();i++){
int v=e[k][i];
dfs(v);
}
if(ttop>top){
top++;
}
else if(ttop<top) top--;
}
signed main(){
read(n);
for(int i=1;i<=n;i++){
s[i]=getchar();
}
for(int i=2;i<=n;i++){
read(fa[i]);
e[fa[i]].push_back(i);
}
dfs(1);
for(int i=1;i<=n;i++){
ans^=i*sum[i];
}
write(ans);
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...