记录编号 584446 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [CSP 2019S]括号树 最终得分 100
用户昵称 Gravatar┭┮﹏┭┮ 是否通过 通过
代码语言 C++ 运行时间 0.356 s
提交时间 2023-11-12 20:54:30 内存使用 21.37 MiB
显示代码纯文本
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N = 5e5+10,M = 1e6+10;
  4. int n;
  5. struct made{
  6. int ver,nx;
  7. }e[M<<1];
  8. int hd[N],tot;
  9. long long f[N],s[N],fa[N];
  10. char a[N];
  11. void add(int x,int y){
  12. tot++;
  13. e[tot].ver = y,e[tot].nx = hd[x],hd[x] = tot;
  14. }
  15. stack<int>st;
  16. void dfs(int x){
  17. int u = 0;
  18. if(a[x] == ')'){
  19. if(!st.empty()){
  20. u = st.top();st.pop();
  21. s[x] = s[fa[u]] + 1;
  22. }
  23. }
  24. else if(a[x] == '(')st.push(x);
  25. f[x] = f[fa[x]] + s[x];
  26. for(int i = hd[x];i;i = e[i].nx)dfs(e[i].ver);
  27. //回溯
  28. if(u != 0)st.push(u);
  29. else if(!st.empty())st.pop();
  30. }
  31. int main(){
  32. freopen("2019brackets.in","r",stdin);
  33. freopen("2019brackets.out","w",stdout);
  34. scanf("%d%s",&n,a+1);
  35. for(int i = 2;i <= n;i++){
  36. int x;scanf("%d",&x);
  37. add(x,i);fa[i] = x;
  38. }
  39. dfs(1);
  40. long long ans = 0;
  41. for(int i = 1;i <= n;i++){
  42. // cout<<f[i]<<endl;
  43. ans = ans ^ ((long long)i * f[i]);
  44. }
  45. printf("%lld\n",ans) ;
  46. return 0;
  47. }