QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#622487#7780. Dark LaTeX vs. Light LaTeXPalbudirWA 622ms408372kbC++204.0kb2024-10-08 22:06:172024-10-08 22:06:18

Judging History

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

  • [2024-11-25 20:53:52]
  • hack成功,自动添加数据
  • (/hack/1258)
  • [2024-10-08 22:06:18]
  • 评测
  • 测评结果:WA
  • 用时:622ms
  • 内存:408372kb
  • [2024-10-08 22:06:17]
  • 提交

answer

#include <bits/stdc++.h>
#include <vector>
using i80 = __int128;
using i64 = long long;
using f80 = long double;
constexpr const int N = 5050;
constexpr const int P = 37;
constexpr const int mod = 7654337;
void work() {
    std::vector<int> pk(N);
    pk[0] = 1;
    for (int i = 1; i < N; ++i) {
        pk[i] = 1ll * pk[i - 1] * P % mod;
    }
    std::string s, t;
    std::cin >> s >> t;
    int n = s.size(), m = t.size();
    std::vector cs(n + 1, std::vector<int>(n + 1, 1)), ct(m + 1, std::vector<int>(m + 1, 1));
    std::vector<int> pis(std::max(n, m) + 1), val(std::max(n, m) + 1);
    auto make = [&](std::string str) {
        int k = str.size();
        // std::cout << str << ":";
        for (int i = 1, j = 0; i < k; ++i) {
            while (j && str[j] != str[i]) {
                j = pis[j - 1];
            }
            if (str[i] == str[j]) {
                ++j;
            }
            if (j) {
                val[i] = val[j - 1] + 1;
            } else {
                val[i] = 0;
            }
            pis[i] = j;
            // std::cout << pis[i] << "," << val[i] << ";\n"[i == k - 1];
        }
    };
    std::string ss = '|' + s, tt = '|' + t;
    for (int i = n; i; --i) {
        make(ss);
        for (int j = n - i; j <= n; ++j) {
            cs[j - n + i][i] += val[j];
        }
        ss = s[i - 1] + ss;
        ss.pop_back();
    }
    for (int i = m; i; --i) {
        make(tt);
        for (int j = m - i; j <= m; ++j) {
            ct[j - m + i][i] += val[j];
        }
        tt = t[i - 1] + tt;
        tt.pop_back();
    }

    std::vector<int> ps(n + 1), pt(m + 1);
    for (int i = 0; i < n; ++i) {
        ps[i + 1] = (1ll * ps[i] * P + s[i] - 'a' + 1) % mod;
    }
    for (int i = 0; i < m; ++i) {
        pt[i + 1] = (1ll * pt[i] * P + t[i] - 'a' + 1) % mod;
    }
    auto makes = [&](int l, int r) { return (ps[r] - 1ll * ps[l] * pk[r - l] % mod + mod) % mod; };
    auto maket = [&](int l, int r) { return (pt[r] - 1ll * pt[l] * pk[r - l] % mod + mod) % mod; };
    std::vector<int> map(mod);
    int res;
    std::vector<int> ms(mod), mt(mod), to;
    std::vector<int> as(mod), bs(mod), at(mod), bt(mod);
    i64 ans = 0;
    for (int k = 1; k <= std::max(n, m); ++k) {
        to.clear();
        for (int l = 0; l + k <= n; ++l) {
            int r = l + k;
            // std::cout << l << "," << r << ":" << cs[l][r] << "\n";
            res = makes(l, r);
            if (ms[res] == k) {
                as[res] += 1;
                bs[res] += cs[l][r];
            } else {
                ms[res] = k;
                as[res] = 1;
                bs[res] = cs[l][r];
            }
            if (map[res] != k) {
                map[res] = k;
                to.push_back(res);
            }
        }
        for (int l = 0; l + k <= m; ++l) {
            int r = l + k;
            res = maket(l, r);
            if (mt[res] == k) {
                at[res] += 1;
                bt[res] += ct[l][r];
            } else {
                mt[res] = k;
                at[res] = 1;
                bt[res] = ct[l][r];
            }
            if (map[res] != k) {
                map[res] = k;
                to.push_back(res);
            }
        }
        for (auto x : to) {
            if (ms[x] != k || mt[x] != k) {
                continue;
            }
            // std::cout << k << ":" << x << "|" << as[x] << "," << at[x] << ";" << bs[x] << "," << bt[x] << "|"
            //           << 1ll * as[x] * bt[x] + 1ll * bs[x] * at[x] - 1ll * as[x] * at[x] << "\n";
            ans += 1ll * as[x] * bt[x] + 1ll * bs[x] * at[x] - 1ll * as[x] * at[x];
        }
    }
    std::cout << ans << "\n";
    return;
}
void init() {
}
int main() {
    init();
    std::ios::sync_with_stdio(false);
    // std::cin.tie(nullptr), std::cout.tie(nullptr);
    int t = 1;
    // std::cin >> t;
    while (t--) {
        work();
    }

    return 0;
}
/*

*/

詳細信息

Test #1:

score: 100
Accepted
time: 0ms
memory: 212496kb

input:

abab
ab

output:

8

result:

ok 1 number(s): "8"

Test #2:

score: 0
Accepted
time: 7ms
memory: 212552kb

input:

abab
abaaab

output:

29

result:

ok 1 number(s): "29"

Test #3:

score: 0
Accepted
time: 7ms
memory: 212456kb

input:

abcd
abcde

output:

10

result:

ok 1 number(s): "10"

Test #4:

score: 0
Accepted
time: 0ms
memory: 212548kb

input:

aaba
ba

output:

6

result:

ok 1 number(s): "6"

Test #5:

score: 0
Accepted
time: 8ms
memory: 212624kb

input:

babababaaabbaabababbbaabbbababbaaaaa
aaaabbaababbab

output:

1161

result:

ok 1 number(s): "1161"

Test #6:

score: 0
Accepted
time: 622ms
memory: 408372kb

input:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...

output:

78156256250000

result:

ok 1 number(s): "78156256250000"

Test #7:

score: -100
Wrong Answer
time: 44ms
memory: 220760kb

input:

gzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggz...

output:

60716981

result:

wrong answer 1st numbers differ - expected: '60716448', found: '60716981'