আমাদের একটি স্ট্রিং s আছে। আমাদের s-এর প্রতিটি সাফিক্সের সাথে s-এর সাদৃশ্যের যোগফল বের করতে হবে। এখানে দুটি স্ট্রিংর মধ্যকার সাদৃশ্য বলতে দীর্ঘতম কমন প্রিফিক্সের দৈর্ঘ্যকে বোঝায়।
উদাহরণস্বরূপ, ইনপুট s = "pqpqpp" হলে আউটপুট হবে 11 কারণ স্ট্রিংটির সাফিক্সগুলো হলো "pqpqpp", "qpqpp", "pqpp", "qpp", "pp" এবং "p"। এই সাবস্ট্রিংগুলোর "pqpqpp"-এর সাথে সাদৃশ্য যথাক্রমে 6, 0, 3, 0, 1, এবং 1। তাই যোগফল = 6 + 0 + 3 + 0 + 1 + 1 = 11।
সমাধানের ধাপসমূহ (Z-অ্যালগরিদম)
length := s-এর আকারtotal := lengthz := [0]দিয়ে একটি লিস্ট শুরু করুনl := 0, r := 0k= 1 থেকেlength - 1পর্যন্ত লুপ চালান:যদি
k > rহয়, তবে:match := 0index := k
index < lengthথাকাকালীন লুপ চালান:যদি
s[index] == s[match]হয়, তবে:match := match + 1index := index + 1
অন্যথায়, লুপ থেকে বেরিয়ে আসুন
match-কেz-এর শেষে যোগ করুনযদি
match > 0হয়, তবে:total := total + matchl := kr := index - 1
অন্যথায়:
যদি
z[k-l] < (r-k)+1হয়, তবে:z[k-l]-কেz-এর শেষে যোগ করুনtotal := total + z[k-l]
অন্যথায়:
match := r - kindex := rindex < lengthথাকাকালীন লুপ চালান:যদি
s[index] == s[match]হয়, তবে:match := match + 1index := index + 1
অন্যথায়, লুপ থেকে বেরিয়ে আসুন
match-কেz-এর শেষে যোগ করুনtotal := total + matchl := kr := index - 1
totalরিটার্ন করুন
উদাহরণ
নিচের ইমপ্লিমেন্টেশনটি দেখুন ভালোভাবে বুঝার জন্য:
def solve(s):
length = len(s)
total = length
z = [0]
l = 0
r = 0
for k in range(1, length):
if k > r:
match = 0
index = k
while index < length:
if s[index] == s[match]:
match += 1
index += 1
else:
break
z.append(match)
if match > 0:
total += match
l = k
r = index - 1
else:
if z[k-l] < (r-k) + 1:
z.append(z[k-l])
total += z[k-l]
else:
match = r - k
index = r
while index < length:
if s[index] == s[match]:
match += 1
index += 1
else:
break
z.append(match)
total += match
l = k
r = index - 1
return total
s = "pqpqpp"
print(solve(s)) ইনপুট
"pqpqpp"
আউটপুট
11