สตริง S ประกอบด้วย 0, 1, ? สร้าง T โดยแทน ? ด้วย 0 หรือ 1 "Unbalancedness" = ค่าสูงสุดของ |count(0) - count(1)| ในทุก substring ของ T หาค่า Unbalancedness ต่ำสุดที่เป็นไปได้
ตัวอย่าง: S="0??0" ผลลัพธ์: 2
ขั้นตอนการแก้ปัญหา (Binary Search + Greedy Check)
- Binary Search คำตอบ
xในช่วง[1, 1e6] - ฟังก์ชัน
check(S, x): จำลองการแทน?โดยรักษาให้ความต่างระหว่าง 0 และ 1 อยู่ในช่วง[-x, x]ตลอด- ตัวแปร
L, R= ช่วงความต่างที่เป็นไปได้ (เริ่ม0, x) - ตัวแปร
B= ยังมีความยืดหยุ่นหรือไม่ - อ่าน
Sทีละตัว:0→L--,R--;1→L++,R++;?→L--,R++(ถ้าL==Rตั้งB=false) - Clamp
L,Rให้อยู่ใน[0, x]โดยคำนึงถึงB - ถ้า
L > R→false
- ตัวแปร
- คืน
R+1จาก Binary Search
ตัวอย่างโค้ด C++
#include <bits/stdc++.h>
using namespace std;
bool check(string S, int x) {
int L = 0, R = x;
bool B = true;
for (char ch : S) {
if (ch == '0') L--, R--;
else if (ch == '1') L++, R++;
else { if (L == R) B = false; L--; R++; }
if (R == x + 1) { if (B) R--; else R -= 2; }
if (L < 0) { if (B) L++; else L += 2; }
if (L > R) return false;
}
return true;
}
int solve(string S) {
int L = 1, R = 1000000;
while (L <= R) {
int Mid = (L + R) >> 1;
if (check(S, Mid)) R = Mid - 1;
else L = Mid + 1;
}
return R + 1;
}
int main() {
string S = "0??0";
cout << solve(S) << endl;
}
อินพุต / เอาต์พุต
Input: 0??0
Output: 2