字符串基操求助,rp++
查看原帖
字符串基操求助,rp++
890346
Autumn_0930楼主2024/8/18 11:51

以下代码RE 10pts,蒟蒻百思不得其解

#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int N=5e5+1;
int n,l,fa[N],pre[N];
int idx,ne[N],e[N],h[N];
string s0,s;
LL ans[N];
void add(int u,int v){
	e[++idx]=v,ne[idx]=h[u],h[u]=idx;
}
void dfs(int u){
	if(s[u]=='('){
		pre[u]=u;
	}else{
		pre[u]=pre[fa[u]];
		if(pre[u]){
			ans[u]=1+ans[fa[pre[u]]];
			pre[u]=pre[fa[pre[u]]];
		}
	}
	for(int i=h[u];i;i=ne[i]) dfs(e[i]);
}
int main(){
	cin>>n;
	cin>>s0;
	l=s0.size();
	for(int i=0;i<l;i++) s[i+1]=s0[i]; //这里 
	for(int i=2;i<=n;i++){
		cin>>fa[i];
		add(fa[i],i);
	}
	dfs(1);
	LL res=ans[1];
	for(int i=2;i<=n;i++){
		ans[i]+=ans[fa[i]]
		res^=(ans[i]*(1LL*i));
	}
	cout<<res;
	return 0;
} 

然后修改了s的初始化操作,像这样:

#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int N=5e5+1;
int n,l,fa[N],pre[N];
int idx,ne[N],e[N],h[N];
string s0,s;
LL ans[N];
void add(int u,int v){
	e[++idx]=v,ne[idx]=h[u],h[u]=idx;
}
void dfs(int u){
	if(s[u]=='('){
		pre[u]=u;
	}else{
		pre[u]=pre[fa[u]];
		if(pre[u]){
			ans[u]=1+ans[fa[pre[u]]];
			pre[u]=pre[fa[pre[u]]];
		}
	}
	for(int i=h[u];i;i=ne[i]) dfs(e[i]);
}
int main(){
	cin>>n;
	cin>>s0;
	l=s0.size();
	s=" "+s0; //这里 
	for(int i=2;i<=n;i++){
		cin>>fa[i];
		add(fa[i],i);
	}
	dfs(1);
	LL res=ans[1];
	for(int i=2;i<=n;i++){
		ans[i]+=ans[fa[i]];
		res^=(ans[i]*(1LL*i));
	}
	cout<<res;
	return 0;
} 

然后AC了

想问下是为什么(好奇

(如果是我太菜了 憋骂我

2024/8/18 11:51
加载中...