超时求调
查看原帖
超时求调
1285198
jianghaochen117楼主2024/10/22 20:47

代码如下:

#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
char s[N];
int ans1 , ans2 , sum[N] , n;
int st[N] , top;
bool chk(int l , int i , int r);
bool chk2(int l , int i , int r); 
bool cal(int l , int r)
{
	if(s[l] == '(' && s[r] == ')')
	{
		int pp = 0;
		for(int i = l + 1;i < r;i++)
		{
			if(s[i] == '(')
			{
				pp++;
			}
			if(s[i] == ')')
			{
				pp--;
			}
			if(pp < 0)
			{
				break;
			}
		}
		if(pp >= 0)
		{
			l++ , r--;
		}
	}
	if(l > r)
	{
		return false;
	}
	if(l == r)
	{
		return s[l] == '1';
	}
	int top = 0 , ft = 0;
	for(int i = r;i >= l;i--)
	{
		switch(s[i])
		{
			case '(':
				top--;
				break;
			case ')':
				top++;
				break;
			case '|':
				if(top == 0)
				{
					return chk(l , i , r);
				}
				break;
			case '&':
				if((!(sum[r] - sum[l - 1])) && (!top) && (!ft))
				{
					return chk2(l , i , r);
				}
				break;
		}
	}
	return chk2(l , ft , r);
}
void init()
{
	for(int i = 1;i <= n;i++)
	{
		sum[i] = sum[i - 1] + (s[i] == '|');
		if(s[i] == '(')
		{
			st[++top] = sum[i] , sum[i] = 0;
		}
		if(s[i] == ')')
		{
			sum[i] = st[top--];
		}
	}
}
bool chk(int l , int i , int r)
{
	bool la = cal(l , i - 1);
	if(la)
	{
		ans2++;
		return true;
	}
	bool lb = cal(i + 1 , r);
	return la | lb;
}
bool chk2(int l , int i , int r)
{
	bool la = cal(l , i - 1);
	if(la == 0)
	{
		ans1++;
		return false;
	}
	bool lb = cal(i + 1 , r);
	return la & lb;
}
int main()
{
	scanf("%s" , s + 1);
	n = strlen(s + 1);
	init();
	bool u = cal(1 , n);
	printf("%d\n%d %d\n" , u , ans1 , ans2);
	return 0;
}

只得了65分

2024/10/22 20:47
加载中...