String

hwl123發表於2024-10-04

String

題面:

給定兩個字串 \(a\), \(b\), 我們稱這兩個字串的所有子序列為壞字串。求最短的非壞字串。

做法

首先要解決一個問題,假設你有一個字串你需要判斷這個字串是否是壞的,怎麼快速判斷?

我們預處理出 nxta[i][j] 表示 \(a\) 字串中第 \(i\) 個位置之後第一個 \(j\) 字元出現的位置。

\(b\) 字串同理。

我們判斷時只需要掃一遍當前的字串,並用 nxt 陣列在 \(a\), \(b\) 上跳,如果都跳出去了,那麼就是好串,反之壞串。

那麼怎麼算最短的這個串呢?

考慮 \(\text{dp}\)

f[i][j] 表示最短的最後一位等於 \(a[i]\), \(b[j]\),的字串長度。

假設當前字串 \(a\) 列舉到位置 \(i\)\(b\) 列舉到位置 \(j\),第 \(i + 1\) 位填 \(x\),轉移式子: f[nxt[i + 1][x]][nxt[j + 1][x]] = f[i][j]。最後我們要的答案就是 f[n + 1][m + 1]

但是這個很對的做法,時間複雜度是 \(O(26 \times n^2)\),只能獲得 \(80\) 的高分。

\(100\) 分也很簡單啊,直接將答案和第 \(2\) 位交換一下,注意到答案不會超過 \(\frac{n}{26}\)

那麼我們的轉移式子要改變一下,假設當前字串 \(a\) 列舉到位置 \(i\),答案字串長度為 \(j\), 下一位 \(x\)

f[nxt[i + 1][x]][j + 1] = max{nxt[f[i][x] + 1][x]}。最後只要判斷 f[i][j] >= m+1 是否成立即可。

相關文章