QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#393540 | #6366. Message | Johnsonloy | WA | 2ms | 15980kb | C++17 | 3.8kb | 2024-04-18 19:21:26 | 2024-04-18 19:21:26 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int, int>
#define mp make_pair
#define db double
const int maxn = 1e6 + 10;
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f3f3f3f3f;
namespace IO {
void openfile() {
#ifndef ONLINE_JUDGE
freopen("in.in", "r", stdin);
freopen("out.out", "w", stdout);
#endif
}
void Min(int& x, int y) {
x = (x < y) ? x : y;
}
void Max(int& x, int y) {
x = (x > y) ? x : y;
}
int add(int x, int y) {
return (x + y) >= mod ? (x + y - mod) : (x + y);
}
int sub(int x, int y) {
return (x < y) ? (x + mod - y) : (x - y);
}
void Add(int& x, int y) {
x = (x + y) >= mod ? (x + y - mod) : (x + y);
}
void Sub(int& x, int y) {
x = (x < y) ? (x - y + mod) : (x - y);
}
int mul(int x, int y) {
return 1ll * x * y % mod;
}
void Mul(int& x, int y) {
x = 1ll * x * y % mod;
}
int qpow(int x, int y = mod - 2) {
int ans = 1;
while (y) {
if (y & 1)
ans = 1ll * x * ans % mod;
x = 1ll * x * x % mod, y >>= 1;
}
return ans;
}
inline int read() {
int x = 0, f = 0;
char w = getchar();
while (!isdigit(w))
f |= w == '-', w = getchar();
while (isdigit(w))
x = x * 10 + w - '0', w = getchar();
if (f)
x = -x;
return x;
}
} // namespace IO
using namespace IO;
char a[maxn], b[maxn], s[maxn];
int n, m, pcnt, scnt, sp[maxn], nex[maxn];
int w[maxn], sum[maxn], f[maxn], tmp[maxn], flag[maxn];
pii p[maxn];
signed main() {
openfile();
ios::sync_with_stdio(false), cin.tie(0);
cin >> a + 1 >> b + 1;
n = strlen(a + 1), m = strlen(b + 1);
for (int i = 1; i <= n; i++)
cin >> w[i];
for (int j = 0; j < 26; j++) {
int l = n + 1, r = -1;
for (int i = 1; i <= m; i++)
if (b[i] == (j + 'a'))
Min(l, i), r = i + 1;
if (~r)
p[++pcnt] = mp(l, j + 1), p[++pcnt] = mp(r, -j - 1);
}
sort(p + 1, p + 1 + pcnt);
for (int k = 1; k < pcnt; k++) {
if (p[k].second > 0)
flag[p[k].second - 1] = 1;
else
flag[-p[k].second - 1] = 0;
for (int i = 0; i <= n; i++)
tmp[i] = -inf;
scnt = 0;
for (int i = 1; i <= n; i++)
if (flag[a[i] - 'a'])
s[++scnt] = a[i], sp[scnt] = i, sum[scnt] = sum[scnt - 1] + w[i];
sp[scnt + 1] = n + 1;
if (p[k].first == p[k + 1].first) {
for (int i = 0; i <= scnt; i++)
for (int j = sp[i] + 2; i < sp[i + 1]; i++)
Max(f[j], f[j - 1]);
continue;
}
int L = p[k].first, R = p[k + 1].first - 1, K = R - L + 1;
nex[L] = L - 1;
for (int i = L + 1, j = L - 1; i <= R; i++) {
while (j >= L && b[j + 1] != b[i])
j = nex[j];
if (b[j + 1] == b[i])
j++;
nex[i] = j;
}
for (int i = 1, j = L - 1; i <= scnt; i++) {
while (j >= L && s[i] != b[j + 1])
j = nex[j];
if (b[j + 1] == s[i])
j++;
if (j == R) {
j = nex[j];
int res = -inf;
for (int x = sp[i - K]; x < sp[i - K + 1]; x++)
Max(res, f[x]);
for (int x = sp[i]; x < sp[i + 1]; x++)
Max(tmp[x], res + sum[i] - sum[i - K]);
}
}
for (int i = 0; i <= n; i++)
f[i] = tmp[i];
}
int ans = -inf, sum = 0;
for (int i = 1; i <= n; i++)
Max(ans, f[i]), sum += w[i];
if (ans < -1e17)
cout << "-1\n";
else
cout << sum - ans;
return 0;
}
詳細信息
Test #1:
score: 100
Accepted
time: 0ms
memory: 15920kb
input:
ababccb abc 7 2 2 4 3 2 1
output:
7
result:
ok single line: '7'
Test #2:
score: -100
Wrong Answer
time: 2ms
memory: 15980kb
input:
babab baab 2 1 3 2 4
output:
-1
result:
wrong answer 1st lines differ - expected: 'You better start from scratch man...', found: '-1'