30分期望得分80分求助
查看原帖
30分期望得分80分求助
396033
zhengzixuan楼主2022/11/8 20:08

考试的时候是打算把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分就彳亍了

2022/11/8 20:08
加载中...