ধরুন আমাদের একটি স্ট্রিং s আছে, আমাদের আলাদা প্যালিনড্রোমের সংখ্যা খুঁজে বের করতে হবে যা আমরা সমস্ত অক্ষর ব্যবহার করে তৈরি করতে পারি। যদি উত্তরটি খুব বড় হয় তবে ফলাফলটি 10^9 + 7 দ্বারা পরিবর্তন করুন।
সুতরাং, যদি ইনপুটটি s ="xyzzy" এর মত হয়, তাহলে আউটপুট হবে 2, যেমন আমরা "zyxyz" এবং "yzxzy" করতে পারি
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
m =10^9+7
-
char_freq :=s এর প্রতিটি অক্ষর এবং তাদের ফ্রিকোয়েন্সি ধারণ করা একটি মানচিত্র
-
বিজোড় :=0
-
char_freq-এ প্রতিটি অক্ষর k এবং ফ্রিকোয়েন্সি v এর জন্য, করুন
-
যদি v mod 2 1 হয়, তাহলে
-
বিজোড় :=বিজোড় + 1
-
-
-
যদি বিজোড়> 1, তাহলে
-
রিটার্ন 0
-
-
অর্ধ_দৈর্ঘ্য :=(s এর আকার) / 2
এর ভাগফল -
res :=অর্ধ_দৈর্ঘ্যের ফ্যাক্টরিয়াল
-
বিভাজক :=1
-
char_freq-এ প্রতিটি অক্ষর k এবং ফ্রিকোয়েন্সি v এর জন্য, করুন
-
ভাজক :=ভাজক * (v/2 এর ভাগফল)
এর ফ্যাক্টরিয়াল
-
-
রিটার্ন (res/dividor এর ভাগফল) mod m
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
উদাহরণ
<প্রে>ম্যাথ ইম্পোর্ট ফ্যাক্টোরিয়াল ক্লাস থেকে সমাধান:def solve(self, s):m =(10**9+7) char_freq ={} s তে c এর জন্য:char_freq[c] =char_freq.get(c, 0) + char_freq.items(এ k,v এর জন্য 1 বিজোড় =0):যদি v % 2 ==1:বিজোড় +=1 যদি বিজোড়> 1:রিটার্ন 0 half_length =len(s)//2 res =factorial(half_length) ভাজক char_freq.items() এ k,v এর জন্য =1:বিভাজক *=ফ্যাক্টোরিয়াল(v//2) রিটার্ন (res//dividor) % mob =Solution()print(ob.solve("xyzzy"))ইনপুট
"xyzzy"
আউটপুট
2