ধরুন আমাদের কাছে সম্ভাব্য '0', '1' বা '?' অক্ষর সহ একটি স্ট্রিং S আছে। আমরা '?' এর প্রতিটি ঘটনা প্রতিস্থাপন করে স্ট্রিং T তৈরি করতে চাই। 0 বা 1 এর সাথে। T-এর ভারসাম্যহীনতা হল:S-তে lth এবং rth অক্ষরের মধ্যে 0 এবং 1 এর সংঘটনের সংখ্যার মধ্যে সর্বাধিক সমস্ত পরম পার্থক্য যেখানে 0 <=l <=r এর ন্যূনতম সম্ভাব্য ভারসাম্যহীনতা খুঁজুন
সুতরাং, যদি ইনপুটটি S ="0??0" এর মত হয়, তাহলে আউটপুট হবে 2
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
Define a function check(), this will take S, x, L := 0, R = x B := true for initialize i := 0, when i < size of S, update (increase i by 1), do: if S[i] is same as '0', then: decrease L and R by 1, each if S[i] is same as '1', then: increase L and R by 1, each if S[i] is same as '?', then: if L is same as R, then: B := false (decrease L by 1) (increase R by 1) if R is same as x + 1, then: if B is non-zero, then: (decrease R by 1) Otherwise R := R - 2 if L < 0, then: if B is non-zero, then: (increase L by 1) Otherwise L := L + 2 if L > R, then: return false return true From the main method, do the following L := 1, R := 1000000 while L <= R, do: Mid := floor of (L + R)/2 if check(S, Mid), then: R := Mid - 1 Otherwise L := Mid + 1 return R + 1
উদাহরণ
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
#include <bits/stdc++.h> using namespace std; bool check(string S, int x) { int L = 0, R = x; bool B = true; for (int i = 0; i < S.size(); i++) { if (S[i] == '0') L--, R--; if (S[i] == '1') L++, R++; if (S[i] == '?') { 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; }
ইনপুট
0??0
আউটপুট
2