CSPJ 350->315……
随便敲了几个,发现1&1&0被卡了
写了两个小时,还没打表分高/kk(打表20pts)
#include <bits/stdc++.h>
using namespace std;
string s;
int c1, c2;
bool calc(string s)
{
string str;
for (int i = 0; i < s.size(); i++)
if (s[i + 2] == '(' && (s[i] == '0' && s[i + 1] == '&' || s[i] == '1' && s[i + 1] == '|'))
{
if (s[i] == '0')
c1++, str += '0';
else
c2++, str += '1';
int cl = 0, cr = 0, p = i + 3;
while (p < s.size())
{
if (s[p] == '(')
cl++;
else if (s[p] == ')')
cr++;
if (cr > cl)
break;
p++;
}
i = p;
}
else
str += s[i];
string ts;
for (int i = 0; i < str.size(); i++)
if (str[i] == '(')
{
int cl = 0, cr = 0, p = i + 1;
while (p < str.size())
{
if (str[p] == '(')
cl++;
else if (str[p] == ')')
cr++;
if (cr > cl)
break;
p++;
}
ts += calc(str.substr(i + 1, p - i - 1)) + '0';
i = p;
}
else
ts += str[i];
string b;
for (int i = 0; i < ts.size(); i++)
if (ts[i + 1] == '&')
{
if (i > 0 && ts[i - 1] == '&')
{
if (b.back() == '0')
c1++;
else if (b.back() == '1' && ts[i] == '0')
{
b.pop_back();
b += '0';
}
}
else
{
if (ts[i] == '0')
{
c1++;
b += '0';
}
else if (ts[i] == '1' && ts[i + 2] == '1')
b += '1';
else
b += '0';
}
i++;
}
else
b += ts[i];
bool ans = b[0] - '0';
for (int i = 1; i < b.size(); i++)
if (b[i] == '|')
{
if (ans)
c2++;
ans |= b[i + 1] - '0';
i++;
}
return ans;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> s;
cout << calc(s) << '\n';
cout << c1 << ' ' << c2;
return 0;
}