85->100,奇怪的问题又增加了
查看原帖
85->100,奇怪的问题又增加了
109220
Farkas_W楼主2021/9/27 22:18

100 CodeCode

#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 CodeCode

#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;
}

不同的地方我做了标记,其实就是退栈的不同,很奇怪第二种方法不行

希望有大佬帮忙解答

2021/9/27 22:18
加载中...