কম্পিউটার টিউটোরিয়াল

পাইথনে স্ট্রিং-এ কোয়েরি অনুযায়ী ডISTINCT সাবস্ট্রিং সংখ্যা বের করার প্রোগ্রাম

একটি স্ট্রিং s (দৈর্ঘ্য n) এবং কোয়েরি লিস্ট Q দেওয়া আছে। Q[i] = (l, r)। প্রতিটি কোয়েরির জন্য s[l..r]-এ কতগুলো ডISTINCT সাবস্ট্রিং আছে সেটি বের করুন।

উদাহরণ

s = "pptpp", Q = [(1,1),(1,4),(1,1),(0,2)] → আউটপুট: [1, 8, 1, 5]

এলগরিদম (Suffix Array + LCP / Kasai Algorithm)

  1. kasai(s, suff, n) ফাংশন দিয়ে LCP অ্যারে বানান।
  2. প্রতিটি কোয়েরির জন্য:
    • sub := s[l:r+1]
    • সাফিক্স অ্যারে বানান এবং সর্ট করুন।
    • kasai দিয়ে LCP বের করুন।
    • ডISTINCT সাবস্ট্রিং = Σ(len(suffix[i]) - lcp[i-1])

পাইথন কোড


def kasai(s, suff, n):
    lcp = [0] * n
    inv = [0] * n
    for i in range(n):
        inv[suff[i]] = i
    k = 0
    for i in range(n):
        if inv[i] == n-1:
            k = 0
            continue
        j = suff[inv[i] + 1]
        while i+k < n and j+k < n and s[i+k] == s[j+k]:
            k += 1
        lcp[inv[i]] = k
        if k > 0:
            k -= 1
    return lcp

def solve(s, Q):
    res = []
    for left, right in Q:
        sub = s[left:right+1]
        length = right - left + 1
        suffix = [[i, sub[i:]] for i in range(length)]
        suffix.sort(key=lambda x: x[1])
        suff, suffix = [list(t) for t in zip(*suffix)]
        lcp = kasai(sub, suff, length)
        count = len(suffix[0])
        for i in range(length-1):
            count += len(suffix[i+1]) - lcp[i]
        res.append(count)
    return res

s = "pptpp"
Q = [(1,1),(1,4),(1,1),(0,2)]
print(solve(s, Q))  # আউটপুট: [1, 8, 1, 5]

ইনপুট / আউটপুট

"pptpp", [(1,1),(1,4),(1,1),(0,2)]
[1, 8, 1, 5]
  1. পাইথনে একটি সংখ্যার বিষম গুণনীয়গুলোর যোগফল বের করার প্রোগ্রাম

  2. পাইথনে একটি সংখ্যার জোড় গুণনীয়গুলোর যোগফল বের করার প্রোগ্রাম

  3. পাইথনে একটি সংখ্যার গুণনীয়গুলোর ন্যূনতম যোগফল বের করার প্রোগ্রাম

  4. পাইথনে একটি সংখ্যার সর্বোচ্চ质因数 বের করার প্রোগ্রাম