仿照第一篇题解的思路。
样例一输出:
1
0 0
样例二输出:
0
0 0
(害得我调了一小时)
Code:
#include <iostream>
#include <string>
using namespace std;
int len, cur, ans1, ans2, opt1[1000005], opt2[1000005], pos1[1000005], pos2[1000005];
string s;
int dfs(int l, int r)
{
if (pos1[r] >= l)
{
int temp = dfs(l, pos1[r] - 1);
if (temp == 1)
{
++ans2;
return 1;
}
return temp | dfs(pos1[r] + 1, r);
}
if (pos2[r] >= l)
{
int temp = dfs(l, pos2[r] - 1);
if (!temp)
{
++ans1;
return 0;
}
return temp & dfs(pos2[r] + 1, r);
}
if (s[l] == '(' && s[r] == ')')
{
return dfs(l + 1, r - 1);
}
return s[l] - '0';
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> s;
len = s.size();
s = ' ' + s;
for (register int i = 1; i <= len; ++i)
{
switch (s[i])
{
case '(':
{
++cur;
break;
}
case ')':
{
--cur;
break;
}
case '|':
{
opt1[cur] = i;
break;
}
case '&':
{
opt2[cur] = i;
break;
}
}
pos1[i] = opt1[cur];
pos2[i] = opt2[cur];
}
cout << dfs(1, len) << "\n" << ans1 << " " << ans2 << "\n";
return 0;
}
有没有dalao帮帮我?