ধরুন আমরা একটি স্ট্রিং s আছে. আমরা একটি সাজানো স্ট্রিং −
না পাওয়া পর্যন্ত s-এ নিম্নলিখিত অপারেশনটি করতে হবে-
সবচেয়ে বড় সূচক i নির্বাচন করুন যেমন 1 <=i
-
সবচেয়ে বড় সূচক j নির্বাচন করুন যাতে i <=j
-
i - 1 এবং j.
সূচকে দুটি অক্ষর বিনিময় করুন -
সূচক i.
থেকে প্রত্যয়টি বিপরীত করুন
স্ট্রিং সাজানোর জন্য আমাদের প্রয়োজনীয় অপারেশনের সংখ্যা খুঁজে বের করতে হবে। উত্তরটি খুব বড় হতে পারে তাই ফলাফল মডিউল 10^9 + 7 ফেরত দিন।
সুতরাং, যদি ইনপুট s ="ppqpp" এর মত হয়, তাহলে আউটপুট হবে 2 কারণ
-
প্রথম অপারেশনে, i=3, j=4। s="ppppq" পেতে s[2] এবং s[4] বিনিময় করুন, তারপর সূচক 3 থেকে সাবস্ট্রিংটি বিপরীত করুন। এখন, s="pppqp"।
-
দ্বিতীয় অপারেশনে, i=4, j=4। s="ppppq" পেতে s[3] এবং s[4] বিনিময় করুন, তারপর ইনডেক্স 4 থেকে সাবস্ট্রিংটি বিপরীত করুন, Now, s ="ppppq"।
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
d :=26 আকারের একটি অ্যারে এবং 0 দিয়ে পূরণ করুন
-
a :=0, t :=1
-
m :=10^9 + 7
-
n :='a'
এর ASCII -
প্রতিটি সূচক i এবং অক্ষর c এর বিপরীত ক্রমে, সূচী 1 থেকে শুরু করুন, করুন
-
j :=c - n
এর ASCII -
d[j] :=d[j] + 1
-
a :=(a + d এর সমস্ত উপাদানের যোগফল [সূচী 0 থেকে j-1]) * t/d[j] এর ভাগফল) mod m
-
t :=t * i/d[j]
এর ভাগফল
-
-
একটি ফেরত দিন
উদাহরণ
আসুন আরও ভালভাবে বোঝার জন্য নিম্নলিখিত বাস্তবায়ন দেখি
def solve(s): d = [0]*26 a = 0 t = 1 m = 10**9 + 7 n = ord('a') for i,c in enumerate(s[::-1],1): j = ord(c) - n d[j] += 1 a = (a+sum(d[:j])*t//d[j]) % m t = t*i//d[j] return a s = "ppqpp" print(solve(s))হিসাবে ফেরত দিন
ইনপুট
"ppqpp"
আউটপুট
2