ধরুন আমাদের একটি স্ট্রিং s আছে, আমাদের s এর সমজাতীয় সাবস্ট্রিংগুলির সংখ্যা বের করতে হবে। উত্তরটি অনেক বড় হতে পারে, তাই উত্তর মডিউল 10^9+7 ফেরত দিন। একটি স্ট্রিংকে সমজাতীয় বলা হয় যখন স্ট্রিংয়ের সমস্ত অক্ষর একই হয়৷
সুতরাং, যদি ইনপুটটি s ="xyyzzzxx" এর মতো হয়, তাহলে আউটপুট হবে 13 কারণ সমজাতীয় সাবস্ট্রিংগুলি যেমন তালিকাভুক্ত করা হয়েছে
-
1."x" তিনবার প্রদর্শিত হয়৷
৷ -
"xx" একবার প্রদর্শিত হয়৷
-
3. "y" দুবার প্রদর্শিত হয়৷
৷ -
"yy" একবার প্রদর্শিত হয়৷
-
5. "z" তিনবার প্রদর্শিত হয়৷
৷ -
"zz" দুবার প্রদর্শিত হয়৷
৷ -
"zzz" একবার প্রদর্শিত হয়৷
তাই, (3 + 1 + 2 + 1 + 3 + 2 + 1) =13।
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
s :=s concatenate "@"
-
h:=একটি নতুন মানচিত্র
-
পূর্ববর্তী:=s[0]
-
c:=1
-
সূচী 1 থেকে শেষ পর্যন্ত প্রতিটি i-এর জন্য, করুন
-
যদি পূর্ববর্তী i এর মত না হয়, তাহলে
-
যদি পূর্ববর্তী*c h তে উপস্থিত থাকে, তাহলে
-
h[prev*c] :=h[prev*c] + 1
-
-
অন্যথায়,
-
h[prev*c]:=1
-
-
c:=1
-
-
যদি পূর্ববর্তী i এর মত হয়, তাহলে
-
c :=c + 1
-
-
পূর্ববর্তী :=i
-
-
ফিন:=0
-
প্রতিটি i এর জন্য h, do
-
t:=i
এর আকার -
k:=0
-
যদিও t 0 এর মত নয়, করুন
-
k :=k + t
-
t :=t - 1
-
-
fin :=fin + k*h[i]
-
-
রিটার্ন ফিন মোড 10^9+7
উদাহরণ
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
def solve(s):
s+="@"
h={}
prev=s[0]
c=1
for i in s[1:]:
if prev!=i:
if prev*c in h:
h[prev*c]+=1
else:
h[prev*c]=1
c=1
if prev == i:
c += 1
prev = i
fin=0
for i in h:
t=len(i)
k=0
while t!=0:
k+=t
t-=1
fin+=k*h[i]
return fin % 1000000007
s = "xyyzzzxx"
print(solve(s)) ইনপুট
"xyyzzzxx"
আউটপুট
13