QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#302851#7780. Dark LaTeX vs. Light LaTeXucup-team173#TL 857ms297548kbC++172.9kb2024-01-11 14:11:202024-01-11 14:11:21

Judging History

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

  • [2024-11-25 20:53:52]
  • hack成功,自动添加数据
  • (/hack/1258)
  • [2024-01-11 14:11:21]
  • 评测
  • 测评结果:TL
  • 用时:857ms
  • 内存:297548kb
  • [2024-01-11 14:11:20]
  • 提交

answer

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

#define fi first
#define se second
#define pb push_back
#define Mp make_pair
#define SZ(x) (int((x).size()))

typedef long long ll;
typedef double db;
typedef vector<int> vi;
typedef pair<int, int> pii;

const int MAXN = 5005, Mod1 = 998244353, Mod2 = 1e9 + 7, base = 131;

string S, T;
int n, m;

struct Hash{
    int val1, val2;
    Hash(int val = 0) : val1(val), val2(val) {}
    Hash(int val1, int val2) : val1(val1), val2(val2) {}
};

Hash operator + (Hash a, Hash b) {
    return Hash((a.val1 + b.val1) % Mod1, (a.val2 + b.val2) % Mod2);
}
Hash operator * (Hash a, Hash b) {
    return Hash(1ll * a.val1 * b.val1 % Mod1, 1ll * a.val2 * b.val2 % Mod2);
}
long long get(Hash t) {
    return 1ll * t.val1 * Mod2 + t.val2;
}

unordered_map<ll, int> cntS, cntT;

int lcp[MAXN][MAXN], f[MAXN][MAXN];
int sum[MAXN][MAXN];

void solve() {
    cin >> S >> T;
    n = S.size(), m = T.size();
    for(int i = 0; i < n; i++) {
        Hash now = 0;
        for(int j = i; j < n; j++) {
            now = now * base + S[j], cntS[get(now)]++;
        }
    }

    for(int i = 0; i < m; i++) {
        Hash now = 0;
        for(int j = i; j < m; j++) {
            now = now * base + T[j], cntT[get(now)]++;
        }
    }

    ll ans = 0;

    for(int i = 0; i < n; i++) {
        Hash now = 0;
        for(int j = i; j < n; j++) {
            now = now * base + S[j];
            if(cntT.count(get(now))) f[i][j] = cntT[get(now)];
            else f[i][j] = 0;
            ans += f[i][j];
        }
    }
    for(int i = 0; i < n; i++) for(int j = 0; j < n; j++)
        sum[i][j] = (i == 0 ? 0 : sum[i - 1][j]) + f[i][j];
    // cout << ans << '\n';
    memset(lcp, 0, sizeof(lcp));
    for(int l = n - 1; l >= 0; l--) {
        for(int r = l + 1; r < n; r++) {
            if(S[l] == S[r]) lcp[l][r] = lcp[l + 1][r + 1] + 1; else lcp[l][r] = 0;
            if(lcp[l][r] > 0) {
                ans += sum[l + lcp[l][r]][r - 1] - sum[l][r - 1];
            } 
        }
    }
    
    for(int i = 0; i < m; i++) {
        Hash now = 0;
        for(int j = i; j < m; j++) {
            now = now * base + T[j];
            if(cntS.count(get(now))) f[i][j] = cntS[get(now)];
            else f[i][j] = 0;
        }
    }
    
    for(int i = 0; i < m; i++) for(int j = 0; j < m; j++)
        sum[i][j] = (i == 0 ? 0 : sum[i - 1][j]) + f[i][j];
    memset(lcp, 0, sizeof(lcp));
    for(int l = m - 1; l >= 0; l--) {
        for(int r = l + 1; r < m; r++) {
            if(T[l] == T[r]) lcp[l][r] = lcp[l + 1][r + 1] + 1; else lcp[l][r] = 0;
            if(lcp[l][r] > 0) ans += sum[l + lcp[l][r]][r - 1] - sum[l][r - 1];
        }
    }
    cout << ans << '\n';
}
signed main() {
    ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    int t = 1;
    // cin >> t;
    while(t--) solve();
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 8ms
memory: 104076kb

input:

abab
ab

output:

8

result:

ok 1 number(s): "8"

Test #2:

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

input:

abab
abaaab

output:

29

result:

ok 1 number(s): "29"

Test #3:

score: 0
Accepted
time: 15ms
memory: 105256kb

input:

abcd
abcde

output:

10

result:

ok 1 number(s): "10"

Test #4:

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

input:

aaba
ba

output:

6

result:

ok 1 number(s): "6"

Test #5:

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

input:

babababaaabbaabababbbaabbbababbaaaaa
aaaabbaababbab

output:

1161

result:

ok 1 number(s): "1161"

Test #6:

score: 0
Accepted
time: 857ms
memory: 297548kb

input:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...

output:

78156256250000

result:

ok 1 number(s): "78156256250000"

Test #7:

score: 0
Accepted
time: 127ms
memory: 165396kb

input:

gzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggz...

output:

60716448

result:

ok 1 number(s): "60716448"

Test #8:

score: 0
Accepted
time: 132ms
memory: 164260kb

input:

mlmllmllmlmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmlmllml...

output:

60679828

result:

ok 1 number(s): "60679828"

Test #9:

score: -100
Time Limit Exceeded

input:

vbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvb...

output:


result: