# String Manipulation# Bitwise Operations# Greedy

d681 - BinaryCount

🔗 前往 ZeroJudge 原題

題目描述

題目要求對輸入的二進位字串,按照順序進行 & (AND) 或 | (OR) 運算,並輸出運算式以及最終結果。輸入字串包含多個 5 位元的二進位數,以及分隔它們的運算子 "and" 或 "or"。運算不考慮運算子的優先順序,而是從左到右依次計算。

解題思路

程式碼直接模擬了題目描述的運算過程。它首先讀取輸入字串,然後遍歷字串,識別運算元和運算子。對於每個運算元,程式碼將其與前一個結果(初始為前 5 個位元)進行 & 或 | 運算,具體取決於遇到的運算子。結果儲存在一個字串 b 中,並在每次運算後更新。最後,程式碼輸出完整的運算式和最終結果。

複雜度分析

  • 時間複雜度: O(n),其中 n 是輸入字串的長度。程式碼需要遍歷整個輸入字串一次。
  • 空間複雜度: O(1),程式碼使用的額外空間是固定的,不隨輸入大小變化。主要用於儲存中間結果 b,其大小固定為 5。

程式碼

#include <iostream>
#include <string>
using namespace std;
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	string a;
	while(getline(cin,a)){
		string b;
		for(int i=0;i<5;i++)
			b+=a[i];
		cout << b;	
		for(int i=0;i<a.length();i++){
			if(a[i]=='o'){
				i+=3;
				cout << "||";
				for(int j=i;j<i+5;j++){
					cout << a[j];
					if(b[j-i]=='1'||a[j]=='1'){
						b[j-i]='1';
					}
					else{
						b[j-i]='0';
					}
				}
			}
			else if(a[i]=='a'){
				i+=4;
				cout << "&&";
				for(int j=i;j<i+5;j++){
					cout << a[j];
					if(b[j-i]!='1'||a[j]!='1'){
						b[j-i]='0';
					}
					else{
						b[j-i]='1';
					}
				}
			}
		}
		cout << " = " << b << "\n";
	}
}

Discussion