考试的时候是打算把3~5个字符跟1、2、3的情况做出来的
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <fstream>
#include <cstring>
#include <cmath>
#include <queue>
#include <stack>
#include <cstdlib>
#include <string>
#define LL long long
#define uLL unsigned long long
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 1e6 + 5;
string s;
int cnt1, cnt2, len, ans, l, r, num;
int calc(char a, char b, char c){
if (b == '|'){
if (a == '1'){
ans = 1;
cnt2++;
}
else
ans = (a - '0') | (c - '0');
}
else {
if (a == '0'){
ans = 0;
cnt1++;
}
else
ans = (a - '0') & (c - '0');
}
return ans;
}
int main(){
cin >> s;
len = s.length();
string ss;
if (len == 3)
ans = calc (s[0], s[1], s[2]);
else if (len == 5){
s[2] = (char)(calc (s[0], s[1], s[2]) + '0');
ans = calc (s[2], s[3], s[4]);
}
else {
int flag = 3;
l = r = num = 0;
for (int i = 0; i < len; i++){
if (s[i] == '(' && s[i - 1] == '|'){
flag = 1;
break;
}
if (s[i] == '(' && s[i - 1] == '&'){
flag = 2;
break;
}
}
if (flag == 1){
ans = 0;
for (int i = 0; i < len; i++){
if (s[i] == '1'){
for (int j = i + 1; j < len; j++){
if (s[j] == '|' && l == r)
cnt2++;
else if (s[j] == '(')
l++;
else if (s[j] == ')' && s[j + 1] != ')')
r++;
}
ans = 1;
break;
}
}
}
else if (flag == 2){
ans = 1;
for (int i = 0; i < len; i++){
if (s[i] == '0'){
for (int j = i + 1; j < len; j++){
if (s[j] == '&' && l == r)
cnt1++;
else if (s[j] == '(')
l++;
else if (s[j] == ')' && s[j + 1] != ')')
r++;
}
ans = 0;
break;
}
}
}
else {
for (int i = 1; i < len; i += 2){
s[i + 1] = char(calc (s[i - 1], s[i], s[i + 1]) + '0');
}
}
ans = s[len];
}
cout << ans << endl << cnt1 << " " << cnt2;
return 0;
}
希望有大佬能够帮忙指正一下错误,能达到80分就彳亍了