QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#124733#1444. Palindrome8BQube#WA 1ms3560kbC++203.0kb2023-07-15 14:57:502023-07-15 14:57:52

Judging History

This is the latest submission verdict.

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-07-15 14:57:52]
  • Judged
  • Verdict: WA
  • Time: 1ms
  • Memory: 3560kb
  • [2023-07-15 14:57:50]
  • Submitted

answer

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
#define X first
#define Y second
#define SZ(a) ((int)a.size())
#define ALL(v) v.begin(), v.end()
#define pb push_back

int dp[305][305], dp2[305][305][305];
int nxt[305][2], prv[305][2];
int lst[2];

int main() {
    ios::sync_with_stdio(0), cin.tie(0);
    int n, t[2] = {};
    string s;
    cin >> n >> s;
    int ans = n;
    for (char c : s)
        ++t[int(c - '0')];
    if ((t[0] & t[1] & 1) == 1)
        return cout << "-1\n", 0;
    s.insert(s.begin(), '?');
    lst[0] = lst[1] = 0;
    for (int i = 1; i <= n + 1; ++i) {
        prv[i][0] = lst[0], prv[i][1] = lst[1];
        if (i <= n) lst[int(s[i] - '0')] = i;
    }
    lst[0] = lst[1] = n + 1;
    for (int i = n; i >= 0; --i) {
        nxt[i][0] = lst[0], nxt[i][1] = lst[1];
        if (i >= 0) lst[int(s[i] - '0')] = i;
    }
    for (int i = 0; i <= n; ++i)
        for (int j = 0; j <= n; ++j)
            dp[i][j] = n + 1;
    /*for (int i = 0; i <= n; ++i)
        for (int j = 0; j <= n; ++j)
            for (int k = 0; k <= n; ++k)
               dp2[i][j][k] = 0;*/
    dp[0][0] = 0; 
    for (int i = 0; i <= n; ++i)
        for (int j = 0; j <= n; ++j) {
            if (dp[i][j] <= n) { 
                dp[i + 1][j] = min(dp[i + 1][j], nxt[dp[i][j]][0]);
                dp[i][j + 1] = min(dp[i][j + 1], nxt[dp[i][j]][1]);
                if ((i + j) * 2 <= n) {
                    int ta = t[0] - i - i, tb = t[1] - j - j;
                    if (ta >= 0 && tb >= 0 && (ta & tb & 1) != 1) {
                        ans = min(ans, n - i - j);
                        //cerr << "chmin dp " << i << " " << j << " (= " << dp[i][j] << ", ta = " << ta << ", tb = " << tb << "\n";
                    }
                }
            }
        }
    for (int r = 1; r <= n; ++r) {
        if (s[r] == '0') { 
            dp2[r][1][0] = r;
            if (prv[r][0] > 0) dp2[r][2][0] = prv[r][0];
        }
        else { 
            dp2[r][0][1] = r;
            if (prv[r][1] > 0) dp2[r][0][2] = prv[r][1];
        }
        for (int i = 0; i <= n; ++i)
            for (int j = 0; j <= n; ++j)
                if (i + j > 0) {
                    if ((t[0] - i) % 2 == 0 && t[0] >= i && (t[1] - j) % 2 == 0 && t[1] >= j) {
                        int c = (t[0] - i) / 2, d = (t[1] - j) / 2;
                        if (dp[c][d] < dp2[r][i][j]) {
                            ans = min(ans, n - i - j - c - d);
                            //cerr << "chmin dp2 " << r << " " << i << " " << j << " (= " << dp2[r][i][j] << ", dp " << c << " " << d << " = " << dp[c][d] << "\n";
                        }
                    }
                    if (nxt[r][0] <= n)
                        dp2[nxt[r][0]][i + 2][j] = max(dp2[nxt[r][0]][i + 2][j], prv[dp2[r][i][j]][0]);
                    if (nxt[r][1] <= n)
                        dp2[nxt[r][1]][i][j + 2] = max(dp2[nxt[r][1]][i][j + 2], prv[dp2[r][i][j]][1]);
                }
    }
    cout << ans << "\n";
}

詳細信息

Test #1:

score: 0
Wrong Answer
time: 1ms
memory: 3560kb

input:

7
1101001

output:

2

result:

wrong answer 1st words differ - expected: '1', found: '2'