求短的反例
查看原帖
求短的反例
601245
I_am_zhima楼主2023/9/29 10:24
#include<bits/stdc++.h>
using namespace std;
#define re register
const int N=5e5+5,inf=1<<27;

int n;

char g[N];

vector<int> e[N];

struct node{
	int front,back,i;//(前合法括号数 后合法..)链接(中间全是合法括号) 
}a[N];

int num[N];//现字符 总数 第一个(不匹配 
void dfs(int x,int sum,node q[],int cnt){ 
	int tp=0;
	if(g[x]=='('){
		++cnt;
		if(q[cnt-1].i)//链接 
			q[cnt].front=q[cnt-1].back,q[cnt].i=0;
		else
			q[cnt].front=q[cnt].back=0,q[cnt].i=0;
	}
	else{
		if(cnt==0)
			q[0].front=q[0].back=q[0].i=0;//断开 
		else{
			if(q[cnt-1].i)//链接 
				q[cnt-1].back++,q[cnt-1].i=1,tp=q[cnt].front+1;
			else{
				if(cnt>1)
					q[cnt-1].back++,q[cnt-1].i=1;
				else
					q[0].back++,q[0].i=1;
				tp=1;
			}
			q[cnt].front=q[cnt].back=q[cnt].i=0;
			cnt--;
		}
	}
	num[x]=sum+tp;
	for(auto i:e[x])
		dfs(i,sum+tp,q,cnt);
}
signed main(){
	//freopen("P5658.in","r",stdin);
	//freopen("P5658.out","w",stdout);
	
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	
	cin>>n;
	cin>>(g+1);
	for(int i=2;i<=n;i++){
		int tmp;cin>>tmp;
		e[tmp].push_back(i);
	}
	
	dfs(1,0,a,0);
	
//	for(re int i=1;i<=n;i++)
//		cout<<num[i]<<" ";
//	cout<<"\n";
	
	int ans=0;
	for(re int i=1;i<=n;i++)
		ans=ans^(num[i]*i);
	cout<<ans<<"\n";
	
	return 0;
}
2023/9/29 10:24
加载中...