QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#124733 | #1444. Palindrome | 8BQube# | WA | 1ms | 3560kb | C++20 | 3.0kb | 2023-07-15 14:57:50 | 2023-07-15 14:57:52 |
Judging History
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'