萌新求助!!!自己写的想法,但是过不了,HELP(写注释了!)
查看原帖
萌新求助!!!自己写的想法,但是过不了,HELP(写注释了!)
551217
GS_MJX楼主2024/9/6 21:11
#include <iostream>
#include <cstdio>

using namespace std;

long long n, f[500005];//f[]记录父节点 
long long ans;

int main()
{
	cin >> n;
	char text[500005];
	for(int i = 1; i <= n; i++)	cin >> text[i];//记录具体文本内容 
	for(int i = 2; i <= n; i++)	cin >> f[i];	
	f[1] = 0;
	for(int i = 1; i <= n; i++)//模拟
	{
		int now_node = i;//当前节点模拟 
		char ch[500005];//记录当前节点下的括号内容(注意是反向的) 
		int cc = 1;
		ch[1] = text[now_node];
		//溯源i对应路径 
		while(now_node != 1)
		{
			ch[++cc] = text[f[now_node]];
			now_node = f[now_node];
		}
		//输出当前i对应的反向括号(测试过是正确的(大抵是)) 
		cout << "i:" << i << ' ';
		for(int j = 1; j <= cc; j++)	cout << ch[j];
		cout << endl;
		//检查子串(倒叙从根节点检查)
		int chack = 0;
		char path[500005] = {0};
		int cnt = 0;
		for(int r = cc; r >= 1; r--)//记录路径从cc至r 
		{
			if(r >= 4)//针对合法括号串的定义3
			{
				if(ch[r] == '(' && ch[r - 1] == ')' && ch[r - 2] == '(' && ch[r - 3] == ')')
					chack++; 
			}
			if(ch[r] == ')' && path[cnt] == '(')//手动栈模拟消除括号 
			{
				chack++;
				cnt--;
			}
			else
			{
				path[++cnt] = ch[r];
			}
		}//记录并更新答案 
		if(i == 1)
			ans = (i * chack);
		else
			ans = (i * chack) ^ ans;
		cout << "i:" << i << ' ' << chack << endl;
	}
	cout << ans;
	return 0;
 } 

HELP!!!

2024/9/6 21:11
加载中...