Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

โปรแกรมนับ Substring ต่างกันสำหรับ Query หลายๆ อย่างใน Python

ให้สตริง s และ Queries Q[i]=(l,r) หาจำนวน Distinct Substrings ใน s[l:r+1] สำหรับแต่ละ Query

ตัวอย่าง: s="pptpp", Q=[(1,1),(1,4),(1,1),(0,2)] → [1,8,1,5]

ขั้นตอน (Suffix Array + LCP per Query)

  1. ต่อ Query: ดึง Substring sub
  2. สร้าง Suffix Array ของ sub
  3. คำนวณ LCP Array ด้วย Kasai Algorithm
  4. Distinct = n(n+1)/2 - sum(LCP)

ตัวอย่างโค้ด

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))  # Output: [1, 8, 1, 5]

อินพุต

"pptpp", [(1,1),(1,4),(1,1),(0,2)]

เอาต์พุต

[1, 8, 1, 5]