回看四年前赛时通过的代码,发现居然假了
查看原帖
回看四年前赛时通过的代码,发现居然假了
124314
lcyxds楼主2024/3/3 17:39
#include <iostream>
#include <fstream>

using namespace std;

int _n;
char _list[500010];
int _p[500010];

bool _checked[500010];
int _last[500010];
int _dp[500010];
long long _sum[500010];

void ParseIn() {
	cin >> _n;
	for (int i = 1; i <= _n; i++) {
		cin >> _list[i];
	}
	for (int i = 2; i <= _n; i++) {
		cin >> _p[i];
	}
}

int Dp(int a) {
	if (_checked[a]) {
		return _dp[a];
	}
	Dp(_p[a]);
	_checked[a] = true;
	if(_list[a] == '(') {
		_last[a] = -1;
		_dp[a] = 0;
		_sum[a] = _sum[_p[a]];
		return 0;
	}
	int last = _p[a];
	while (last && _last[last]!=-1) {
		last = _last[last];
	}
	if (_list[last] == '(') {
		_last[a] = _p[last];
		_dp[a] = _dp[_p[last]]+1;
		_sum[a] = _sum[_p[a]]+_dp[a];
		return _dp[a];
	}
	_last[a] = -1;
	_dp[a] = 0;
	_sum[a] = _sum[_p[a]];
	return 0;
}

void Core() {
	_checked[1] = true;
	_last[1] = -1;
	for (int i = 2; i <= _n; i++) {
		Dp(i);
//		cout << "sum[" << i << "]=" << _sum[i] << endl;
	}
}

void WriteOut() {
	long long ans = 0;
	for (int i = 1; i <= _n; i++) {
		ans = ans^(long long)_sum[i]*i;
	}
	cout << ans << endl;
}

int main() {
	ParseIn();
	Core();
	WriteOut();
	return 0;
}

链套菊花卡爆

顺便贴一个略微改动后的正确代码:

#include <iostream>
#include <fstream>

using namespace std;

int _n;
char _list[500010];
int _p[500010];

bool _checked[500010];
int _last[500010];
int _dp[500010];
long long _sum[500010];

void ParseIn() {
	cin >> _n;
	for (int i = 1; i <= _n; i++) {
		cin >> _list[i];
	}
	for (int i = 2; i <= _n; i++) {
		cin >> _p[i];
	}
}

int Dp(int a) {
	if (_checked[a]) {
		return _dp[a];
	}
	Dp(_p[a]);
	_checked[a] = true;
	if(_list[a] == '(') {
		_last[a] = a;
		_dp[a] = 0;
		_sum[a] = _sum[_p[a]];
		return 0;
	}
	int last = _last[_p[a]];
	if (_list[last] == '(') {
		_last[a] = _last[_p[last]];
		_dp[a] = _dp[_p[last]]+1;
		_sum[a] = _sum[_p[a]]+_dp[a];
		return _dp[a];
	}
	_last[a] = a;
	_dp[a] = 0;
	_sum[a] = _sum[_p[a]];
	return 0;
}

void Core() {
	_checked[1] = true;
	_last[1] = 1;
	for (int i = 2; i <= _n; i++) {
		Dp(i);
//		cout << "sum[" << i << "]=" << _sum[i] << endl;
	}
}

void WriteOut() {
	long long ans = 0;
	for (int i = 1; i <= _n; i++) {
		ans = ans^(long long)_sum[i]*i;
	}
	cout << ans << endl;
}

int main() {
	ParseIn();
	Core();
	WriteOut();
	return 0;
}
2024/3/3 17:39
加载中...