100 Code
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<vector>
#include<stack>
#define int long long
#define re register int
#define il inline
using namespace std;
il int read()
{
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)&&ch!='-')ch=getchar();
if(ch=='-')f=-1,ch=getchar();
while(isdigit(ch))x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return x*f;
}
il void print(int x)
{
if(x<0)putchar('-'),x=-x;
if(x/10)print(x/10);
putchar(x%10+'0');
}
const int N=5e5+5;
int n,fa[N],ans,num[N],cnt[N];
bool a[N];char c;
vector<int>e[N];
stack<int>q;
il void dfs(int x)
{
int p=0;num[x]=num[fa[x]];
if(a[x])q.push(x);
else if(!q.empty()){
p=q.top();q.pop();
cnt[x]=cnt[fa[p]]+1;
num[x]+=cnt[x];
}
ans^=(x*num[x]);
for(re i=0;i<e[x].size();i++)dfs(e[x][i]);
if(p)q.push(p);else if(!q.empty())q.pop();//这里
}
signed main()
{
n=read();
for(re i=1;i<=n;i++)
{
cin>>c;
a[i]=(c=='(');
}
for(re i=2;i<=n;i++)fa[i]=read(),e[fa[i]].push_back(i);
dfs(1);print(ans);
return 0;
}
85 Code
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<vector>
#include<stack>
#define int long long
#define re register int
#define il inline
using namespace std;
il int read()
{
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)&&ch!='-')ch=getchar();
if(ch=='-')f=-1,ch=getchar();
while(isdigit(ch))x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return x*f;
}
il void print(int x)
{
if(x<0)putchar('-'),x=-x;
if(x/10)print(x/10);
putchar(x%10+'0');
}
const int N=5e5+5;
int n,fa[N],ans,num[N],cnt[N];
bool a[N],vis[N];char c;
vector<int>e[N];
stack<int>q;
il void dfs(int x)
{
int p=0;
if(a[x])q.push(x),num[x]=num[fa[x]],vis[x]=1;
else {
if(!q.empty()){
p=q.top();q.pop();
vis[p]=0;
cnt[x]=cnt[fa[p]]+1;
num[x]=num[fa[x]]+cnt[x];
}
else num[x]=num[fa[x]];
}
for(re i=0;i<e[x].size();i++)dfs(e[x][i]);
if(p)q.push(p);
while(vis[x]){vis[q.top()]=0;q.pop();}//这里
}
signed main()
{
n=read();
for(re i=1;i<=n;i++)
{
cin>>c;
a[i]=(c=='(');
}
for(re i=2;i<=n;i++)fa[i]=read(),e[fa[i]].push_back(i);
dfs(1);
for(re i=1;i<=n;i++)ans^=(i*num[i]);
print(ans);
return 0;
}
不同的地方我做了标记,其实就是退栈的不同,很奇怪第二种方法不行
希望有大佬帮忙解答