QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#609921#7780. Dark LaTeX vs. Light LaTeXucup-team2179#TL 1943ms308976kbC++202.8kb2024-10-04 14:27:422024-10-04 14:27:43

Judging History

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

  • [2024-11-25 20:53:52]
  • hack成功,自动添加数据
  • (/hack/1258)
  • [2024-10-04 14:27:43]
  • 评测
  • 测评结果:TL
  • 用时:1943ms
  • 内存:308976kb
  • [2024-10-04 14:27:42]
  • 提交

answer

#include<bits/stdc++.h>
#define int long long
#define ll long long
#define db double
#define i128 __int128_t
#define pii pair<int, int>
using namespace std;
const int maxn = 6e3 + 10;
struct exKMP {
    int z[maxn];
    void get_z(string& c) {
        int len = c.length();
        int p = 0, k = 1, l;
        z[0] = len;
        while (p + 1 < len && c[p] == c[p + 1])
            p++;
        z[1] = p;
        for (int i = 2; i < len; i++) {
            p = k + z[k] - 1;
            l = z[i - k];
            if (i + l <= p)
                z[i] = l;
            else {
                int j = max(0ll, p - i + 1);
                while (i + j < len && c[i + j] == c[j])
                    j++;
                z[i] = j;
                k = i;
            }
        }
    }
} Z;
unordered_map<int, int> mps, mpt;
const int base = 131, mod = 1e18 + 201;
int mi[maxn];
int h1[maxn], h2[maxn];
int get_hash(int h[], int l, int r) {
    l--;
    int res = ((h[r] - (i128)h[l] * mi[r - l]) % mod + mod) % mod;
    return res;
}
int sub[maxn][maxn];
int cal(string s, string t, int id) {
int n = s.length(), m = t.length();
    for (int i = 1; i <= n; i++) {
        h1[i] = ((i128)h1[i - 1] * base + s[i - 1]) % mod;
    }
    for (int i = 1; i <= m; i++) {
        h2[i] = ((i128)h2[i - 1] * base + t[i - 1]) % mod;
    }
    for (int i = 1; i <= n; i++)
        for (int j = i; j <= n; j++) 
            mps[get_hash(h1, i, j)]++;
    for (int i = 1; i <= m; i++)
        for (int j = i; j <= m; j++)
            mpt[get_hash(h2, i, j)]++;
    int ans = 0;
    if (id == 0) {
    for (auto it : mps)
        ans += it.second * mpt[it.first];
    }
    // cout << "same" << ans << endl;
    for (int i = 1; i <= n; i++) {
        string str2 = s.substr(i - 1);
        Z.get_z(str2);
        for (int j = 3; j <= str2.length(); j++) {
            int mxlen = min(Z.z[j - 1], j - 1);
            if (!mxlen) continue;
            // 右端点在 j - 1, 左端点在 2 到 mxlen + 1
            sub[i - 1 + j - 1][i - 1 + 2]++;
            sub[i - 1 + j - 1][i - 1 + mxlen + 1 + 1]--;
        }
    }
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= i; j++) {
            sub[i][j] += sub[i][j - 1];
            if (sub[i][j] > 0) {
                ans += sub[i][j] * mpt[get_hash(h1, j, i)];
                // cout << "l, r = " << j << " " << i << endl;
            }
        }
    return ans;
}
signed main() {
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    mi[0] = 1;
    for (int i = 1; i < maxn; i++)
        mi[i] = (i128)mi[i - 1] * base % mod;
    string s, t;
    cin >> s >> t;
    int res = cal(s, t, 0);
    memset(sub, 0, sizeof sub);
    mps.clear();
    mpt.clear();
    res += cal(t, s, 1);
    cout << res << endl;
    return 0;
}

详细

Test #1:

score: 100
Accepted
time: 7ms
memory: 285840kb

input:

abab
ab

output:

8

result:

ok 1 number(s): "8"

Test #2:

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

input:

abab
abaaab

output:

29

result:

ok 1 number(s): "29"

Test #3:

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

input:

abcd
abcde

output:

10

result:

ok 1 number(s): "10"

Test #4:

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

input:

aaba
ba

output:

6

result:

ok 1 number(s): "6"

Test #5:

score: 0
Accepted
time: 12ms
memory: 285832kb

input:

babababaaabbaabababbbaabbbababbaaaaa
aaaabbaababbab

output:

1161

result:

ok 1 number(s): "1161"

Test #6:

score: 0
Accepted
time: 1943ms
memory: 286424kb

input:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...

output:

78156256250000

result:

ok 1 number(s): "78156256250000"

Test #7:

score: 0
Accepted
time: 258ms
memory: 308840kb

input:

gzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggz...

output:

60716448

result:

ok 1 number(s): "60716448"

Test #8:

score: 0
Accepted
time: 292ms
memory: 308976kb

input:

mlmllmllmlmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmlmllml...

output:

60679828

result:

ok 1 number(s): "60679828"

Test #9:

score: -100
Time Limit Exceeded

input:

vbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvb...

output:


result: