ধরুন আমাদেরকে একটি এনকোড করা বার্তা দেওয়া হয়েছে যা পূর্ণসংখ্যার একটি স্ট্রিং। এখন, এই পূর্ণসংখ্যাগুলিকে বর্ণমালার একটি নির্দিষ্ট অক্ষরে ম্যাপ করা যেতে পারে। a 1 তে ম্যাপ করা হয়েছে, b 2 তে ম্যাপ করা হয়েছে, c 3 তে ম্যাপ করা হয়েছে ইত্যাদি। এছাড়াও একটি '*' অক্ষর রয়েছে যা বার্তাটিতে থাকতে পারে এবং এটি 1 থেকে 9 পর্যন্ত যে কোনও সংখ্যায় ম্যাপ করা যেতে পারে। তাই একটি বার্তা 'ইনপুট' দেওয়া হলে, এটিকে কতগুলি উপায়ে ডিকোড করা যায় তা আমাদের খুঁজে বের করতে হবে।
সুতরাং, যদি ইনপুটটি input ="18" এর মত হয়, তাহলে আউটপুট হবে 2।
বার্তাটিকে "ah" তে ডিকোড করা যেতে পারে, যেমন 1 মানচিত্র "a" থেকে এবং 8 মানচিত্র "h" তে। এছাড়াও, সংখ্যাটি "r" তে ম্যাপ করতে পারে, যেমন 18টি মানচিত্র "r" এ। তাই। মোট 2টি উপায়ে ইনপুট ডিকোড করা যায়৷
৷এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
- n :=ইনপুটের দৈর্ঘ্য
- আকারের একটি অ্যারে dynArr সংজ্ঞায়িত করুন:n+1 এবং এটিকে শূন্য দিয়ে শুরু করুন
- p :=1
- k :='0'
- dynArr[0] :=1
- আরম্ভ করার জন্য i :=1, যখন i <=n, আপডেট করুন (i 1 দ্বারা বৃদ্ধি করুন), −
- করুন
- c :=ইনপুট[i - 1]
- যদি c 0 এর মতো হয় এবং না হয় (k '1' এর সমান বা k '2' এর মতো বা k '*' এর মতো), তাহলে −
- p :=0
- লুপ থেকে বেরিয়ে আসুন
- যদি ইনপুট[i - 1] '*' এর মত হয়, তাহলে −
- dynArr[i] :=(dynArr[i - 1] * 9) mod m
- যদি k '1' এর মত হয় বা k '*' এর মত হয়, তাহলে −
- dynArr[i] :=(dynArr[i] + dynArr[i - 2] * 9) mod m
- যদি k '2' এর মত হয় বা k '*' এর মত হয়, তাহলে −
- dynArr[i] :=(dynArr[i] + (dynArr[i - 2] * 6) mod m) mod m
- অন্যথায়,
- যদি c '0' এর সমান না হয়, তাহলে −
-
- যদি k '1' এর মত হয় বা k '*' এর মত হয়, তাহলে −
- dynArr[i] :=(dynArr[i] + dynArr[i - 2]) mod m
- যদি (k '2' এর মতো বা k '*' এর মতো) এবং ইনপুট[i - 1] <='6', তাহলে −
- dynArr[i] :=(dynArr[i] + (dynArr[i - 2]) mod m) mod m
- যদি k '1' এর মত হয় বা k '*' এর মত হয়, তাহলে −
- k :=c
- যদি p অ-শূন্য হয়, তাহলে dynArr[n] ফেরত দিন, অন্যথায় 0 দিন
উদাহরণ
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
#include<bits/stdc++.h> using namespace std; const long m = 1e9 + 7; int solve(string input) { int n = input.length(); long long dynArr[n + 1] = {0}; bool p = 1; char k = '0'; dynArr[0] = 1; for (int i = 1; i <= n; i++) { char c = input[i - 1]; if (c == 0 && !(k == '1' || k == '2' || k == '*')) { p = 0; break; } if (input[i - 1] == '*') { dynArr[i] = (dynArr[i - 1] * 9) % m; if (k == '1' || k == '*') dynArr[i] = (dynArr[i] + dynArr[i - 2] * 9) % m; if (k == '2' || k == '*') dynArr[i] = (dynArr[i] + (dynArr[i - 2] * 6) % m) % m; } else { if (c != '0') dynArr[i] = dynArr[i - 1]; if (k == '1' || k == '*') dynArr[i] = (dynArr[i] + dynArr[i - 2]) % m; if ((k == '2' || k == '*') && input[i - 1] <= '6') dynArr[i] = (dynArr[i] + (dynArr[i - 2]) % m) % m; } k = c; } return p ? dynArr[n] : 0; } int main() { cout<< solve("18") <<endl; return 0; }
ইনপুট
18
আউটপুট
2