QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#628401#7780. Dark LaTeX vs. Light LaTeXHirroML 2ms13880kbC++203.2kb2024-10-10 20:00:532024-10-10 20:00:54

Judging History

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

  • [2024-11-25 20:53:52]
  • hack成功,自动添加数据
  • (/hack/1258)
  • [2024-10-10 20:00:54]
  • 评测
  • 测评结果:ML
  • 用时:2ms
  • 内存:13880kb
  • [2024-10-10 20:00:53]
  • 提交

answer

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 10005;
int ans = 0;
int lcp[N][N];
int n,m;
class SAM {
public:
    vector<int> e[N >> 1];
    int tot = 1, np = 1;
    int fa[N >> 1], ch[N >> 1][27], len[N >> 1],cnt[N >> 1];
    int F[N >> 1],s[N>>1],sp=0;
    void extend(int c) {
        int p = np; np = ++tot;
        len[np] = len[p] + 1; cnt[np] = 1;
        for (; p && !ch[p][c]; p = fa[p])ch[p][c] = np;
        if (p == 0)fa[np] = 1;
        else {
            int q = ch[p][c];
            if (len[q] == len[p] + 1)fa[np] = q;
            else {
                int nq = ++tot;
                len[nq] = len[p] + 1;
                fa[nq] = fa[q]; fa[q] = nq; fa[np] = nq;
                for (; p && ch[p][c] == q; p = fa[p])ch[p][c] = nq;
                memcpy(ch[nq], ch[q], sizeof(ch[q]));
            }
        }
    }
    void dfs(int u) {
        for (auto& v : e[u]) {
            dfs(v);
            cnt[u] += cnt[v];
        }
    }
    void create(string& a) {
        for (int i = 0; i < (int)a.size(); i++)extend(a[i] - 'a');
        for (int i = 2; i <= tot; i++)e[fa[i]].push_back(i);
        for (int i = tot; i >= 1; i--)F[i] = i;
        dfs(1);
    }
    int find(int u) {
        if (u == F[u])return u;
        return F[u] = find(F[u]);
    }
    void tarjan(int u) {
        for (auto v : e[u]) {
            tarjan(v);
            F[v] = u;
        }
        if (e[u].size() == 0) {
            for (int i = 1; i <= sp;i++)lcp[n - len[u] + 1][n - len[s[i]] + 1] = len[find(s[i])];
            s[++sp] = u;
        }
    }
    void init() {
        for (int i = 1; i <= tot; i++) {
            fa[i] = len[i]=cnt[i] = 0;
            e[i].clear();
            memset(ch[i], 0, sizeof(ch[i]));
        }
        tot = 1, np = 1;
        sp = 0;
    }
}SA, SB;
int cnt[N][N],cmo=0;
void solve(string a,string b) {
    SA.init();
    SB.init();
    n = a.size(); m = b.size();
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            lcp[i][j] = 0;
            cnt[i][j] = 0;
        }
    }
    string t = a+'{';
    reverse(t.begin(),t.end());

    SA.create(t);
    SB.create(b);
    for (int i = 0; i < n; i++) {
        int p = 1;
        for (int j = i; j < n; j++) {
            if (SB.ch[p][a[j] - 'a'])p = SB.ch[p][a[j] - 'a'];
            else break;
            cnt[i][j] = SB.cnt[p];
        }
    }
    SA.tarjan(1);
    for (int i = 0; i < n; i++)for (int j = i + 2; j < n; j++)lcp[i][j] = min(j - i - 1, max(lcp[i][j], lcp[j][i]));
    if(!cmo)
    for (int i = 0; i < n; i++) {
        for (int j = i; j < n; j++) {
            ans += cnt[i][j];
        }
    }
    cmo = 1;
    for (int j = 0; j < n; j++) {
        for (int i = 1; i <= j; i++) {
            cnt[i][j] += cnt[i - 1][j];
        }
    }
    for (int i = 0; i < n; i++) {
        for (int j = i + 2; j < n; j++) {//add i+1...j-1,i+2...j-1,..,i+lcp[i][j]-1...j-1
            ans += cnt[i + lcp[i][j]][j - 1] - cnt[i][j - 1];
        }
    }
    //cout << ans << '\n';
}
signed main() {
    string a, b;
    cin >> a>>b;
    solve(a, b);
    solve(b, a);
    cout << ans << '\n';
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

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

input:

abab
ab

output:

8

result:

ok 1 number(s): "8"

Test #2:

score: 0
Accepted
time: 2ms
memory: 11844kb

input:

abab
abaaab

output:

29

result:

ok 1 number(s): "29"

Test #3:

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

input:

abcd
abcde

output:

10

result:

ok 1 number(s): "10"

Test #4:

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

input:

aaba
ba

output:

6

result:

ok 1 number(s): "6"

Test #5:

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

input:

babababaaabbaabababbbaabbbababbaaaaa
aaaabbaababbab

output:

1161

result:

ok 1 number(s): "1161"

Test #6:

score: -100
Memory Limit Exceeded

input:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...

output:


result: