QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#371928#7780. Dark LaTeX vs. Light LaTeXcomeintocalm#TL 1032ms15380kbC++172.8kb2024-03-30 18:06:502024-03-30 18:06:56

Judging History

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

  • [2024-11-25 20:53:52]
  • hack成功,自动添加数据
  • (/hack/1258)
  • [2024-03-30 18:06:56]
  • 评测
  • 测评结果:TL
  • 用时:1032ms
  • 内存:15380kb
  • [2024-03-30 18:06:50]
  • 提交

answer

#include <bits/stdc++.h>

const long long P = 1e15 + 37;

auto GetNext(std::string &s, const int n) -> std::pair<std::vector<int>, std::vector<int>> {
    std::vector<int> nxt(n);
    std::vector<int> d(n, 1);
    nxt[0] = -1;
    for (int i = 1, j = -1; i < n; ++i) {
        while (~j && s[i] != s[j + 1])
            j = nxt[j];
        if (s[i] == s[j + 1])
            ++j;
        nxt[i] = j;
        if (~j) {
            d[i] = d[j] + 1;
        }
    }
    return {nxt, d};
}

auto calc(std::string &s, std::string &t) -> long long {
    std::unordered_map<long long, int> mp;
    int n = (int)s.length();
    int m = (int)t.length();

    for (int i = 0; i < m; ++i) {
        long long ha = 0;
        for (int j = i; j < m; ++j) {
            ha = (137ll * ha + (t[j] - 'a' + 1)) % P;
            ++mp[ha];
        }
    }

    long long ret = 0;

    std::vector<long long> base(n);
    base[0] = 1;
    for (int i = 1; i < n; ++i)
        base[i] = 137ll * base[i - 1] % P;
    for (int R = 0; R + 1 < n; ++R) {
        auto o = std::move(s.substr(R + 1, n));
        auto [nxt, dep] = std::move(GetNext(o, n - R));
        std::vector<int> d(R + 1);
        for (int i = 0, j = -1; i < R; ++i) {
            while (~j && (s[i] != o[j + 1] || j + 1 >= n - R)) {
                j = nxt[j];
            }
            if (s[i] == o[j + 1])
                ++j;
            if (~j) {
                // printf("i: %d  R: %d  j: %d\n", i, R, j);
                d[i] = dep[j];
            }
        }
        long long ha = 0;
        for (int i = R; i > 0; --i) {
            ha = (ha + base[R - i] * (s[i] - 'a' + 1) % P) % P;
            if (mp.find(ha) != mp.end()) {
                ret += 1ll * mp[ha] * d[i - 1];
            }
            // printf("hash %d  i:%d d[i-1]: %d\n", ha, i, d[i - 1]);
        }
    }

    return ret;
}

auto qwq(std::string &s, std::string &t) -> long long {
    std::unordered_map<long long, int> mp;
    int n = (int)s.length();
    int m = (int)t.length();

    for (int i = 0; i < m; ++i) {
        long long ha = 0;
        for (int j = i; j < m; ++j) {
            ha = (137ll * ha + (t[j] - 'a' + 1)) % P;
            ++mp[ha];
        }
    }

    long long ret = 0;

    for (int i = 0; i < n; ++i) {
        long long ha = 0;
        for (int j = i; j < n; ++j) {
            ha = (137ll * ha + (s[j] - 'a' + 1)) % P;
            if (mp.find(ha) != mp.end()) {
                ret += mp[ha];
            }
        }
    }
    return ret;
}

int main() {
    // freopen("d.in", "r", stdin);
    // freopen("d.out", "w", stdout);
    std::string s, t;
    std::cin >> s >> t;
    long long ans = qwq(s, t);
    ans += calc(s, t);
    ans += calc(t, s);
    // std::cout << calc(s, t) << ' ' << calc(t, s) << ' ' <<  qwq(s, t) << std::endl;
    std::cout << ans << std::endl;
    return 0;
}

詳細信息

Test #1:

score: 100
Accepted
time: 1ms
memory: 3512kb

input:

abab
ab

output:

8

result:

ok 1 number(s): "8"

Test #2:

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

input:

abab
abaaab

output:

29

result:

ok 1 number(s): "29"

Test #3:

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

input:

abcd
abcde

output:

10

result:

ok 1 number(s): "10"

Test #4:

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

input:

aaba
ba

output:

6

result:

ok 1 number(s): "6"

Test #5:

score: 0
Accepted
time: 1ms
memory: 3648kb

input:

babababaaabbaabababbbaabbbababbaaaaa
aaaabbaababbab

output:

1161

result:

ok 1 number(s): "1161"

Test #6:

score: 0
Accepted
time: 1032ms
memory: 4032kb

input:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...

output:

78156256250000

result:

ok 1 number(s): "78156256250000"

Test #7:

score: 0
Accepted
time: 185ms
memory: 15036kb

input:

gzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggz...

output:

60716448

result:

ok 1 number(s): "60716448"

Test #8:

score: 0
Accepted
time: 193ms
memory: 15380kb

input:

mlmllmllmlmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmlmllml...

output:

60679828

result:

ok 1 number(s): "60679828"

Test #9:

score: -100
Time Limit Exceeded

input:

vbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvb...

output:


result: