ধরুন একটি স্ট্রিং আছে। এই স্ট্রিংটিকে একটি জাদুকরী স্ট্রিং S বলা হয়, যেটি শুধুমাত্র '1' এবং '2' নিয়ে গঠিত এবং নিম্নলিখিত নিয়মগুলি মেনে চলে -
- স্ট্রিং S জাদুকর কারণ '1' এবং '2' অক্ষরের সংলগ্ন ঘটনার সংখ্যা একত্রিত করলে স্ট্রিং S নিজেই তৈরি হয়।
- স্ট্রিং S এর প্রথম কয়েকটি উপাদান হল নিম্নলিখিত − S ="1221121221221121122……"
- যদি আমরা পরপর '1' এবং '2'-কে S-তে গোষ্ঠীবদ্ধ করি, তা হবে −1 22 11 2 1 22 1 22 11 2 11 22 ...... এবং প্রতিটি গ্রুপে '1' বা '2'-এর উপস্থিতি হল − 1 2 2 1 1 2 1 2 2 1 2 2 ......
এখন ধরুন ইনপুট হিসাবে আমাদের একটি পূর্ণসংখ্যা N আছে, জাদুকরী স্ট্রিং S-এর প্রথম N সংখ্যায় '1'-এর সংখ্যা বের করুন। সুতরাং ইনপুটটি যদি 6-এর মতো হয়, তাহলে আউটপুট হবে 3, যাদুকরী স্ট্রিং-এর প্রথম 6টি উপাদানের মতো। হল "12211"। এতে তিনটি 1s রয়েছে, তাই 3 ফেরত দিন।
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
- যদি n <=0, তারপর 0 দিন, যদি n <=3 হয়, তারপর 1 ফেরত দিন
- ret :=1, n আকারের একটি অ্যারে অ্যারে তৈরি করুন
- আরর[0] :=1, arr[1] :=2, arr[2] :=2
- মাথা :=2, লেজ :=3 এবং সংখ্যা :=1
- যখন লেজ
- আমি রেঞ্জ 0 থেকে arr[head] – 1
- arr[tail] :=সংখ্যা
- যদি num হয় 1 এবং tail
- লেজ 1 দ্বারা বাড়ান
- যদি লেজ>=n হয়, তাহলে লুপ ভেঙে দিন
- num =num XOR 3
- মাথা 1 দ্বারা বাড়ান
- আমি রেঞ্জ 0 থেকে arr[head] – 1
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
উদাহরণ
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int magicalString(int n) {
if(n <= 0) return 0;
if(n <= 3) return 1;
int ret = 1;
vector <int> arr(n);
arr[0] = 1;
arr[1] = 2;
arr[2] = 2;
int head = 2;
int tail = 3;
int num = 1;
while(tail < n){
for(int i = 0; i < arr[head]; i++){
arr[tail] = num;
if(num == 1 && tail < n) ret++;
tail++;
if(tail >= n) break;
}
num ^= 3;
head++;
}
return ret;
}
};
main(){
Solution ob;
cout << (ob.magicalString(6));
} ইনপুট
6
আউটপুট
3