QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#622616#7780. Dark LaTeX vs. Light LaTeXCatreapTL 1536ms249120kbC++204.6kb2024-10-08 23:19:242024-10-08 23:19:24

Judging History

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

  • [2024-11-25 20:53:52]
  • hack成功,自动添加数据
  • (/hack/1258)
  • [2024-10-08 23:19:24]
  • 评测
  • 测评结果:TL
  • 用时:1536ms
  • 内存:249120kb
  • [2024-10-08 23:19:24]
  • 提交

answer

#include <algorithm>
#include <cstdio>
#include <cstring>
#include <map>
#include <vector>
#include <unordered_map>
#include <functional>
#include <string>
#include <utility>

typedef long long ll;

struct pair_hash {
    template <class T1, class T2>
    std::size_t operator () (const std::pair<T1,T2> &p) const {
        auto h1 = std::hash<T1>{}(p.first);
        auto h2 = std::hash<T2>{}(p.second);
        return h1 ^ h2;  
    }
};

const int N = 5005;

const int B1 = 7393, B2 = 2333;
const int M1 = 998244353, M2 = 1e9 + 7;

void build(char* str, int n, std::pair<int, int>* h) {
    h[0] = {0, 0};
    for (int i = 1; i <= n; i++) {
        h[i].first = ((ll)h[i - 1].first * B1 + str[i]) % M1;
    }
    for (int i = 1; i <= n; i++) {
        h[i].second = ((ll)h[i - 1].second * B2 + str[i]) % M2;
    }
}

std::pair<int, int> calc(std::pair<int, int>* h, int l, int r) {
    static int pow1[N], pow2[N];
    if (!pow1[0]) {
        pow1[0] = pow2[0] = 1;
        for (int i = 1; i < N; i++) {
            pow1[i] = (ll)pow1[i - 1] * B1 % M1;
        }
        for (int i = 1; i < N; i++) {
            pow2[i] = (ll)pow2[i - 1] * B2 % M2;
        }
    }
    return {((ll)h[r].first - (ll)h[l - 1].first * pow1[r - l + 1] % M1 + M1) % M1,
            ((ll)h[r].second - (ll)h[l - 1].second * pow2[r - l + 1] % M2 + M2) % M2};
}

void calcZ(char *s, int n, int *z) {
    for (int i = 1, l = 0, r = 0; i < n; ++i) {
        if (i <= r && z[i - l] < r - i + 1) {
            z[i] = z[i - l];
        } else {
            z[i] = std::max(0, r - i + 1);
            while (i + z[i] < n && s[z[i]] == s[i + z[i]])
                ++z[i];
        }
        if (i + z[i] - 1 > r)
            l = i, r = i + z[i] - 1;
    }
}

int main() {
    static char s[N], t[N];
    static int zs[N][N], zt[N][N];
    static int sum[N][N];
    std::unordered_map<std::pair<int, int>, int, pair_hash> mp_s, mp_t;
    static std::pair<int, int> hs[N], ht[N];
    scanf("%s%s", s + 1, t + 1);
    int n = strlen(s + 1), m = strlen(t + 1);
    build(s, n, hs);
    build(t, m, ht);
    ll ans = 0;
    for (int i = 1; i <= n; i++) {
        for (int j = i; j <= n; j++) {
            mp_s[calc(hs, i, j)]++;
        }
    }
    for (int i = 1; i <= m; i++) {
        for (int j = i; j <= m; j++) {
            mp_t[calc(ht, i, j)]++;
        }
    }
    for (int i = 1; i <= n; i++) {
        calcZ(s + i, n - i + 1, zs[i]);
        // printf("zs[%d] = ", i);
        for (int j = 2; i + j <= n; j++) {
            if (zs[i][j]) {
                sum[i + j - 1][i + 1]++;
                sum[i + j - 1][std::min(i + j, i + zs[i][j] + 1)]--;
            }
            // printf("%d ", zs[i][j]);
        }
        // printf("\n");
    }
    for (int j = 2; j < n; j++) {
        // printf("sum[%d] = ", j);
        for (int i = 1; i <= n; i++) {
            sum[j][i] += sum[j][i - 1];
            // printf("%d ", sum[j][i]);
        }
        // printf("\n");
        for (int i = 2; i <= j; i++) {
            auto it = mp_t.find(calc(hs, i, j));
            if (it != mp_t.end()) {
                ans += (ll)sum[j][i] * (it->second);
            }
        }
        // printf("ans = %d\n", ans);
    }
    for (int i = 1; i <= n; i++) {
        for (int j = i; j <= n; j++) {
            auto it = mp_t.find(calc(hs, i, j));
            if (it != mp_t.end()) {
                ans += it->second;
            }
        }
    }
    // printf("ans = %d\n", ans);
    memset(sum, 0, sizeof(sum));
    for (int i = 1; i <= m; i++) {
        calcZ(t + i, m - i + 1, zt[i]);
        // printf("zt[%d] = ", i);
        for (int j = 2; i + j <= m; j++) {
            if (zt[i][j]) {
                sum[i + j - 1][i + 1]++;
                sum[i + j - 1][std::min(i + j, i + zt[i][j] + 1)]--;
            }
            
            // printf("%d ", zt[i][j]);
        }
        // printf("\n");
    }
    for (int j = 2; j < m; j++) {
        // printf("sum[%d] = ", j);
        for (int i = 1; i <= m; i++) {
            sum[j][i] += sum[j][i - 1];
            // printf("%d ", sum[j][i]);
        }
        // printf("\n");
        for (int i = 2; i <= j; i++) {
            auto it = mp_s.find(calc(ht, i, j));
            if (it != mp_s.end()) {
                ans += (ll)sum[j][i] * (it->second);
            }
        }
        // printf("ans = %d\n", ans);
    }
    printf("%lld\n", ans);
    return 0;
}
/*
abab
abaaab
zs[1] = 0 2 0 
zs[2] = 0 1 
zs[3] = 0 
zs[4] = 
zt[1] = 0 1 1 2 0 
zt[2] = 0 0 0 1 
zt[3] = 2 1 0 
zt[4] = 1 0 
zt[5] = 0 
zt[6] = 
*/

詳細信息

Test #1:

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

input:

abab
ab

output:

8

result:

ok 1 number(s): "8"

Test #2:

score: 0
Accepted
time: 3ms
memory: 103796kb

input:

abab
abaaab

output:

29

result:

ok 1 number(s): "29"

Test #3:

score: 0
Accepted
time: 3ms
memory: 103800kb

input:

abcd
abcde

output:

10

result:

ok 1 number(s): "10"

Test #4:

score: 0
Accepted
time: 3ms
memory: 103796kb

input:

aaba
ba

output:

6

result:

ok 1 number(s): "6"

Test #5:

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

input:

babababaaabbaabababbbaabbbababbaaaaa
aaaabbaababbab

output:

1161

result:

ok 1 number(s): "1161"

Test #6:

score: 0
Accepted
time: 1536ms
memory: 249120kb

input:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...

output:

78156256250000

result:

ok 1 number(s): "78156256250000"

Test #7:

score: 0
Accepted
time: 371ms
memory: 157664kb

input:

gzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggz...

output:

60716448

result:

ok 1 number(s): "60716448"

Test #8:

score: 0
Accepted
time: 353ms
memory: 155452kb

input:

mlmllmllmlmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmlmllml...

output:

60679828

result:

ok 1 number(s): "60679828"

Test #9:

score: -100
Time Limit Exceeded

input:

vbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvb...

output:


result: