給定兩個長度分別為 $N, M$ 的字串 $a, b$,請輸出滿足以下條件的字串 $c$ 的長度:
定義 $|s|$ 為 $s$ 的長度。
字串 $t$ 為字串 $s$ 的子序列若存在一個序列 $a_1, a_2, \ldots, a_{|t|}$ 滿足 $1 \leq a_1 < a_2 < \ldots < a_{|t|} \leq |s|$ 且 $t_i = s_{a_i} \forall 1 \leq i \leq |t|$。
字串 $s$ 為回文字串若 $s_i = s_{|s| + 1 - i} \forall 1 \leq i \leq |s|$。
以下為提供的解法,請構造出一筆滿足題目條件的測資讓該程式碼 WA。
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false), cin.tie(0);
int n, m;
string s, t;
cin >> n >> m >> s >> t;
string revs(s.rbegin(), s.rend()), revt(t.rbegin(), t.rend());
s = "$" + s;
revs = "$" + revs;
t = "$" + t;
revt = "$" + revt;
vector dp(n + 1, vector (n + 1, vector (m + 1, vector <int>(m + 1, 0))));
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
for (int k = 1; k <= m; ++k) {
for (int l = 1; l <= m; ++l) {
if (s[i] == revs[j] && s[i] == t[k] && s[i] == revt[l]) {
dp[i][j][k][l] = dp[i - 1][j - 1][k - 1][l - 1] + 1;
} else {
dp[i][j][k][l] = max({dp[i - 1][j][k][l],
dp[i][j - 1][k][l],
dp[i][j][k - 1][l],
dp[i][j][k][l - 1]});
}
}
}
}
}
cout << dp[n][n][m][m] << '\n';
}
順帶一提,在 PreExam 中共有 10 個人寫過這個解,而出題者也寫過 QQ。
輸入第一行有兩個正整數 $N, M$,代表字串 $a$ 與字串 $b$ 的長度。
輸入第二行有一個長度為 $N$ 且僅由小寫英文字母組成的字串 $a$。
輸入第三行有一個長度為 $M$ 且僅由小寫英文字母組成的字串 $b$。
請輸出一行,上面有一個整數代表字串 $c$ 的長度
以下程式碼能產生本題合法但一定不會讓你得到 AC 的測試資料:
#include <stdio.h>
int main() {
puts("3 4");
puts("ioi");
puts("camp");
}
No. | Testdata Range | Constraints | Score |
---|---|---|---|
1 | 0 | 無其他限制 | 100 |