QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#768443#7780. Dark LaTeX vs. Light LaTeXfosovWA 40ms203140kbC++142.6kb2024-11-21 10:43:302024-11-21 10:43:30

Judging History

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

  • [2024-11-25 20:53:52]
  • hack成功,自动添加数据
  • (/hack/1258)
  • [2024-11-21 10:43:30]
  • 评测
  • 测评结果:WA
  • 用时:40ms
  • 内存:203140kb
  • [2024-11-21 10:43:30]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;

#define ll long long 
#define lll __int128
#define INF 0x3f3f3f3f
#define LNF 0x3f3f3f3f3f3f3f3fll
#define MOD 998244353
#define pii pair<int, int>
#define pll pair<ll, ll>
#define ld long double
#define fi first
#define se second
#define all(a) a.begin(), a.end()

#define N 5050

int lcp[N][N]; // longest common prefix of s[i:] and s[j:]
int lcs[N][N]; // longest common suffix of s[:i] and t[:j]
int pre[N], sum[N];

ll go(string s, string t) {
    memset(lcp, 0, sizeof lcp);
    memset(lcs, 0, sizeof lcs);

    int n = s.length(), m = t.length();
    for (int i = n-1; i >= 0; -- i) {
        for (int j = n-1; j >= 0; -- j) {
            lcp[i][j] = s[i] != s[j] ? 0 : 1 + lcp[i+1][j+1];
        }
    }
    for (int i = 1; i <= n; ++ i) {
        for (int j = 1; j <= m; ++ j) {
            lcs[i][j] = s[i-1] != t[j-1] ? 0 : 1 + lcs[i-1][j-1];
        }
    }

    ll res = 0;
    for (int r = 1; r < n; ++ r) {
        pii x(1, 0);
        memset(pre, 0, sizeof pre);
        for (int j = 1; j <= m; ++ j) {
            sum[lcs[r][j]] += lcs[r][j];
            pre[lcs[r][j]] ++;
            x.se = max(x.se, lcs[r][j]);
        }
        for (int j = N-2; j >= 0; -- j) {
            sum[j] += sum[j+1];
            pre[j] += pre[j+1];
        }
        if (x.fi > x.se) continue;

        for (int l = 0; l < r; ++ l) {
            int len = lcp[l][r];
            pii y(r - l - len, r - l - 1);
            if (y.fi > y.se) continue;
            if (y.fi > x.se || y.se < x.fi) continue;

            pii z(max(x.fi, y.fi), min(x.se, y.se));

            ll di = 0;
            di += sum[z.fi] - sum[z.se] - (pre[z.fi] - pre[z.se]) * (z.fi - 1);
            di += pre[z.se] * (z.se - z.fi + 1);
            res += di;
        }
    }

    return res;
}

int main() {
#ifdef TEST
    freopen("zz.in", "r+", stdin);
#endif
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    string s, t; cin >> s >> t;
    unordered_map<string, int> cnt;
    ll res = 0;
    for (int i = 0; i < t.length(); ++ i) {
        string cur = "";
        for (int j = i; j < t.length(); ++ j) {
            cur += t[j];
            cnt[cur] ++;
        }
    }
    for (int i = 0; i < s.length(); ++ i) {
        string cur = "";
        for (int j = i; j < s.length(); ++ j) {
            cur += s[j];
            res += cnt[cur];
        }
    }
    res += go(s, t) + go(t, s);

    cout << res << '\n';
}   

// sum - ksum <= 0

// sum - ksum > 0;
// sum > ksum

// aba-a
// a|b|a-b
// b|a|b-a

詳細信息

Test #1:

score: 100
Accepted
time: 24ms
memory: 202856kb

input:

abab
ab

output:

8

result:

ok 1 number(s): "8"

Test #2:

score: 0
Accepted
time: 24ms
memory: 202800kb

input:

abab
abaaab

output:

29

result:

ok 1 number(s): "29"

Test #3:

score: 0
Accepted
time: 20ms
memory: 202952kb

input:

abcd
abcde

output:

10

result:

ok 1 number(s): "10"

Test #4:

score: 0
Accepted
time: 40ms
memory: 202792kb

input:

aaba
ba

output:

6

result:

ok 1 number(s): "6"

Test #5:

score: -100
Wrong Answer
time: 32ms
memory: 203140kb

input:

babababaaabbaabababbbaabbbababbaaaaa
aaaabbaababbab

output:

1590714272

result:

wrong answer 1st numbers differ - expected: '1161', found: '1590714272'