QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#393540#6366. MessageJohnsonloyWA 2ms15980kbC++173.8kb2024-04-18 19:21:262024-04-18 19:21:26

Judging History

你现在查看的是最新测评结果

  • [2024-04-18 19:21:26]
  • 评测
  • 测评结果:WA
  • 用时:2ms
  • 内存:15980kb
  • [2024-04-18 19:21:26]
  • 提交

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;
}

Details

Tip: Click on the bar to expand more detailed information

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'