代码如下:
#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分