TopCoder

Caido
主唱太拼命了

User's AC Ratio

96.0% (24/25)

Submission's AC Ratio

81.2% (82/101)

Tags

Description

給定兩個長度分別為 $N, M$ 的字串 $a, b$,請輸出滿足以下條件的字串 $c$ 的長度:

  • $c$ 為 $a$ 的子序列
  • $c$ 為 $b$ 的子序列
  • $c$ 為回文字串
  • $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。

Input Format

輸入第一行有兩個正整數 $N, M$,代表字串 $a$ 與字串 $b$ 的長度。
輸入第二行有一個長度為 $N$ 且僅由小寫英文字母組成的字串 $a$。
輸入第三行有一個長度為 $M$ 且僅由小寫英文字母組成的字串 $b$。

  • $1 \leq N, M \leq 80$
  • $|a| = N, |b| = M$
  • $a, b$ 的每個字元皆為小寫英文字母

Output Format

請輸出一行,上面有一個整數代表字串 $c$ 的長度

Sample Input 1

8 8
acbcabaa
aabbccba

Sample Output 1

5

Sample Input 2

14 8
ioicampisgreat
wiwihorz

Sample Output 2

2

Sample Input 3

7 7
rotator
rotator

Sample Output 3

7

Hints

以下程式碼能產生本題合法但一定不會讓你得到 AC 的測試資料:

#include <stdio.h>
int main() {
    puts("3 4");
    puts("ioi");
    puts("camp");
}

Problem Source

Subtasks

No. Testdata Range Constraints Score
1 0 無其他限制 100

Testdata and Limits

No. Time Limit (ms) Memory Limit (VSS, KiB) Output Limit (KiB) Subtasks
0 1000 65536 65536 1