QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#536732#7780. Dark LaTeX vs. Light LaTeXRepeaterTL 1ms3872kbC++203.8kb2024-08-29 16:05:342024-08-29 16:05:38

Judging History

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

  • [2024-11-25 20:53:52]
  • hack成功,自动添加数据
  • (/hack/1258)
  • [2024-08-29 16:05:38]
  • 评测
  • 测评结果:TL
  • 用时:1ms
  • 内存:3872kb
  • [2024-08-29 16:05:34]
  • 提交

answer

#include<iostream>
using namespace std;
#include<vector>
#include<map>

using ll = long long;

const int p[2] = {133, 331};
const int mod[2] = {(int)1e9 + 463, (int)1e9 + 469};

long long pn[2][5001];

void init(){
    pn[0][0] = pn[1][0] = 1;
    for (int i = 1; i <= 5000; ++i){
        pn[0][i] = pn[0][i - 1] * p[0] % mod[0];
        pn[1][i] = pn[1][i - 1] * p[1] % mod[1];
    }
    return;
}

vector<pair<ll, ll>> sH, tH;

pair<ll, ll> sget(int l, int r){
    pair<ll, ll> s;
    s.first = (sH[r].first - sH[l].first * pn[0][r - l] % mod[0] + mod[0]) % mod[0];
    s.second = (sH[r].second - sH[l].second * pn[1][r - l] % mod[1] + mod[1]) % mod[1];
    return s;
}

pair<ll, ll> tget(int l, int r) {
    pair<ll, ll> t;
    t.first = (tH[r].first - tH[l].first * pn[0][r - l] % mod[0] + mod[0]) % mod[0];
    t.second = (tH[r].second - tH[l].second * pn[1][r - l] % mod[1] + mod[1]) % mod[1];
    return t;
}

map<pair<ll, ll>, int> scnt, tcnt;

void solve(){
    string s, t;
    cin >> s >> t;

    s = " " + s, t = " " + t;
    sH.resize(s.size());
    tH.resize(t.size());

    ll ans = 0;

    sH[0].first = 0, sH[0].second = 0;
    tH[0].first = 0, tH[0].second = 0;

    for (int i = 1; i < s.size(); ++i){
        sH[i].first = (sH[i - 1].first * p[0] + s[i]) % mod[0];
        sH[i].second = (sH[i - 1].second * p[1] + s[i]) % mod[1];

        for (int j = 0; j < i; ++j){
            ++scnt[sget(j, i)];
            //cout << j << " " << i << " " << sget(j, i).first << " " << sget(j, i).second << " " << scnt[sget(j, i)] << "\n";
        }
    }

    for (int i = 1; i < t.size(); ++i) {
        tH[i].first = (tH[i - 1].first * p[0] + t[i]) % mod[0];
        tH[i].second = (tH[i - 1].second * p[1] + t[i]) % mod[1];

        for (int j = 0; j < i; ++j) {
            pair<ll, ll> tem = tget(j, i);
            ++tcnt[tem];
            ans += scnt[tem];
        }
    }

    vector<vector<ll>> spre(s.size() + 1), tpre(t.size() + 1);

    for (int i = 1; i < s.size(); ++i){
        spre[i].resize(i + 1);
        spre[i][0] = 0;
        for (int j = 0; j < i; ++j){
            spre[i][j + 1] = spre[i][j] + tcnt[sget(j, i)];
        }
    }

    for (int i = 1; i < t.size(); ++i){
        tpre[i].resize(i + 1);
        tpre[i][0] = 0;
        for (int j = 0; j < i; ++j){
            tpre[i][j + 1] = tpre[i][j] + scnt[tget(j, i)];
        }
    }

    vector<int> z(max(s.size(), t.size()));
    int l = 0, r = 0;

    for (int i = 1; i < s.size(); ++i){
        l = i, r = i;
        z[i] = s.size() - i;
        for (int j = i + 1; j < s.size(); ++j){
            z[j] = 0;
            if(j <= r){
                z[j] = min(r - j + 1, z[i + j - l]);
            }
            while(j + z[j] < s.size() && s[i + z[j]] == s[j + z[j]]){
                l = j;
                r = j + z[j];
                ++z[j];
            }
        }

        for (int j = i + 1; j < s.size(); ++j){
            int tem = min(j - i - 1, z[j]);
            ans += spre[j - 1][i + tem] - spre[j - 1][i];
        }
    }

    for (int i = 1; i < t.size(); ++i) {
        l = i, r = i;
        z[i] = t.size() - i;
        for (int j = i + 1; j < t.size(); ++j) {
            z[j] = 0;
            if (j <= r) {
                z[j] = min(r - j + 1, z[i + j - l]);
            }
            while (j + z[j] < t.size() && t[i + z[j]] == t[j + z[j]]) {
                l = j;
                r = j + z[j];
                ++z[j];
            }
        }

        for (int j = i + 1; j < t.size(); ++j) {
            int tem = min(j - i - 1, z[j]);
            ans += tpre[j - 1][i + tem] - tpre[j - 1][i];
        }
    }

    cout << ans << "\n";

    return;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);

    init();

    solve();

    return 0;
}

詳細信息

Test #1:

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

input:

abab
ab

output:

8

result:

ok 1 number(s): "8"

Test #2:

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

input:

abab
abaaab

output:

29

result:

ok 1 number(s): "29"

Test #3:

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

input:

abcd
abcde

output:

10

result:

ok 1 number(s): "10"

Test #4:

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

input:

aaba
ba

output:

6

result:

ok 1 number(s): "6"

Test #5:

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

input:

babababaaabbaabababbbaabbbababbaaaaa
aaaabbaababbab

output:

1161

result:

ok 1 number(s): "1161"

Test #6:

score: -100
Time Limit Exceeded

input:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...

output:


result: