B. Flip the Bits
鏈接B. Flip the Bits
題目大意:
給你兩個只有01的字串a和b,要求對a的前綴進行0->1和1->0的操作,
使得a和b相同,注意,只有當a的那段前綴中的0和1數量相同時才可進行翻轉,
解題思路
此題,蒟蒻一開始是不會的,參見了別人的代碼~
首先,我們對a進行翻轉的條件是0和1的數量相同,那么,我們用一句巧妙的代碼來進行判斷
cnt += (a[i] == '1') - (a[i] == '0');
次數的cnt,初始值為0
當a[i]==1時,cnt+=1,
當a[i]==0時,cnt+=-1
也就是說,如果此時前綴的01數量相等的話,那么cnt=0
否則cnt不為0
后邊的就簡單了,a到b總是通過對前綴進行翻轉,那么只要a和b不一樣時,如果cnt=0,那么我們就可以翻轉a,如果不為0的話,那么就不可能翻轉得到b
代碼如下:
#include <bits/stdc++.h>
using namespace std;
void solve() {
int n;
string a, b;
cin >> n >> a >> b;
a.push_back('0');
b.push_back('0');
int cnt = 0;
for(int i = 0; i < n; i++) {
cnt += (a[i] == '1') - (a[i] == '0');///統計0和1是否相等,若cnt==0則相等可翻轉,否則不相等,不可翻轉
if((a[i] == b[i]) != (a[i + 1] == b[i + 1]) && cnt != 0) {///兩個相鄰的數01位置交叉且目前不可翻轉
cout << "NO\n";
return;
}
}
cout << "YES\n";
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int te;
cin >> te;
while(te--) {
solve();
}
}
這道題雖然不是很難,但是也能體現出編程人的功底,我參考的這個寫法就很簡潔,如果是本人自己寫,大概寫不到這種程度,
共勉
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/272915.html
標籤:其他
上一篇:安卓開發1 微信頁面框架設計
