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