এই সমস্যায়, আমাদের একটি পজিটিভ সংখ্যা ১ দেওয়া আছে। আমাদের কাজ হল সর্টেড অর্ডারে Nth বাইনারি স্ট্রিং খুঁজে বের করা।
আমাদের দুটি সিম্বল a এবং b ব্যবহার করে তৈরি করা স্ট্রিংগুলোর একটি অনন্ত লিস্ট থেকে Nth স্ট্রিং খুঁজে বের করতে হবে যা লেক্সিকোগ্রাফিক্যালি সর্টেড।
লিস্টটি হল −
a, b, aa, ab, ba, bb, aaa, aab, aba, …
উদাহরণ
সমস্যাটি বুঝতে একটি উদাহরণ নিই:
ইনপুট : N = 8 আউটপুট : aab
সমাধানের পদ্ধতি
এই সমস্যার একটি সহজ সমাধান হল লুপ ব্যবহার করে সব n স্ট্রিং জেনারেট করা। এবং তারপর Nth স্ট্রিং রিটার্ন করা। এই সমাধান কাজ করে কিন্তু বড় N-এর জন্য কার্যকর নয়।
তাই, আমরা আরেকটি সমাধান দেখব যা কম সময়ে সমাধান দিতে পারে।
এই সমস্যা সমাধানের আরেকটি পদ্ধতি হল স্ট্রিংর জন্য রিলেটিভ ইনডেক্স ব্যবহার করা। এই事实证明 ব্যবহার করে যে ২টি সিম্বল দিয়ে দৈর্ঘ্য N-এর স্ট্রিং 2^N개가 তৈরি করা যায়। রিলেটিভ ইনডেক্স ব্যবহার করে বাইনারি ফর্ম স্ট্রিংটি বের করা যায়।
রিলেটিভ ইনডেক্স = N + 1 - 2^( floor(log(N+1)) )
উদাহরণ প্রোগ্রাম
আমাদের সমাধানের কাজকাণ্ড ব্যাখ্যা করার প্রোগ্রাম:
#include <bits/stdc++.h>
using namespace std;
#define ll long long int
string findBinString(ll n) {
ll len = (int)log2(n + 1);
int ri = n + 1 - pow(2, len);
ll i = 0;
string binString = "";
for (i = 0; i < len; i++) {
binString += 'a';
}
i = 0;
while (ri > 0) {
if (ri % 2 == 1)
binString[i] = 'b';
ri /= 2;
i++;
}
reverse(binString.begin(), binString.end());
return binString;
}
int main() {
ll n = 245;
cout << "The " << n << "-th binary string in sorted order is " << findBinString(n);
return 0;
}
আউটপুট
The 245-th binary string in sorted order is bbbabba