QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#735990#7780. Dark LaTeX vs. Light LaTeXSuhy#TL 8ms42788kbC++173.2kb2024-11-11 23:23:492024-11-11 23:23:50

Judging History

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

  • [2024-11-25 20:53:52]
  • hack成功,自动添加数据
  • (/hack/1258)
  • [2024-11-11 23:23:50]
  • 评测
  • 测评结果:TL
  • 用时:8ms
  • 内存:42788kb
  • [2024-11-11 23:23:49]
  • 提交

answer

#include <bits/stdc++.h>
#define ll long long

using namespace std;

const int maxn = 5003;
const int b1 = 31;
const int b2 = 37;
const int p1 = 10000037;
const int p2 = 1000000029;

int n, m;
int s[maxn], t[maxn];
int ps1[maxn], ps2[maxn], pt1[maxn], pt2[maxn];
int mp1[10000046];
int pwb1[maxn], pwb2[maxn];
ll ans;

int mns(int x, int y, int p)
{
    return (x >= y) ? (x - y) : (x + p - y);
}

int f[maxn];

void wok(int nn, int dlt)
{
    f[0] = -1;
    for(int i = 1; i < nn; i ++)
    {
        int j = f[i - 1];
        while(j >= 0 && s[j + 1 + dlt] != s[i + dlt])
            j = f[j];
        if(s[j + 1 + dlt] == s[i + dlt])
            j ++;
        f[i] = j;
        while(j >= 0)
        {
            int r = i - j - 1;
            int l = j + 1;
            if(l <= r) 
            {
                int hsh1 = mns(ps1[r + dlt], 1ll * ps1[l - 1 + dlt] * pwb1[(r - l + 1)] % p1, p1);
                //int hsh2 = mns(ps2[r + dlt], 1ll * ps2[l - 1 + dlt] * pwb2[(r - l + 1)] % p2, p2);
                ans += mp1[hsh1];
                //cout<<l + dlt<<' '<<r + dlt<<' '<<min(mp1[hsh1], mp2[hsh2])<<endl;
            }
            j = f[j];
        }
    }
}

void work()
{
    memset(mp1, 0, sizeof mp1);
    for(int i = 1; i <= m; i ++)
    {
        for(int j = 1; j <= i; j ++)
        {
            mp1[mns(pt1[i], 1ll * pt1[j - 1] * pwb1[(i - j + 1)] % p1, p1)] ++;
            //mp2[mns(pt2[i], 1ll * pt2[j - 1] * pwb2[(i - j + 1)] % p2, p2)] ++;
            //cout<<"S hsh "<<i<<' '<<j<<' '<<mns(pt1[i], 1ll * pt1[j - 1] * pwb1[(i - j + 1)] % p1, p1)<<endl;
        }
    }
    for(int i = 0; i < n; i ++)
    {
        wok(n - i, i + 1);
    }
}

signed main()
{
    char c = getchar();
    while('a' <= c && c <= 'z')
        s[++ n] = c - 'a' + 1, c = getchar();
    while(!('a' <= c && c <= 'z'))
        c = getchar();
    while('a' <= c && c <= 'z')
        t[++ m] = c - 'a' + 1, c = getchar();
    for(int i = 1; i <= n; i ++)
    {
        ps1[i] = (1ll * ps1[i - 1] * b1 % p1 + s[i]) % p1;
        //ps2[i] = (1ll * ps2[i - 1] * b2 % p2 + s[i]) % p2;
    }
    for(int i = 1; i <= m; i ++)
    {
        pt1[i] = (1ll * pt1[i - 1] * b1 % p1 + t[i]) % p1;
        //pt2[i] = (1ll * pt2[i - 1] * b2 % p2 + t[i]) % p2;
    }
    pwb1[0] = pwb2[0] = 1;
    for(int i = 1; i <= max(n, m); i ++)
    {
        pwb1[i] = 1ll * pwb1[i - 1] * b1 % p1;
        //pwb2[i] = 1ll * pwb2[i - 1] * b2 % p2;
    }
    work();
    //cout<<ans<<endl;
    //6
    swap(n, m);
    for(int i = 1; i <= max(n, m); i ++)
    {
        swap(s[i], t[i]);
        swap(ps1[i], pt1[i]);
        //swap(ps2[i], pt2[i]);
    }
    work();
    //cout<<ans<<endl;
    //12
    for(int i = 1; i <= n; i ++)
    {
        for(int j = 1; j <= i; j ++)
        {
            int hsh1 = mns(ps1[i], 1ll * ps1[j - 1] * pwb1[(i - j + 1)] % p1, p1);
            //int hsh2 = mns(ps2[i], 1ll * ps2[j - 1] * pwb2[(i - j + 1)] % p2, p2);
            ans += mp1[hsh1];
            // for(int k = j; k <= i; k ++)
            //     putchar(s[k] + 'a' - 1);
            // putchar(' ');
            //cout<<j<<' '<<i<<' '<<min(mp1[hsh1], mp2[hsh2])<<endl;
        }
    }
    //30
    cout<<ans<<endl;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 3ms
memory: 42724kb

input:

abab
ab

output:

8

result:

ok 1 number(s): "8"

Test #2:

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

input:

abab
abaaab

output:

29

result:

ok 1 number(s): "29"

Test #3:

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

input:

abcd
abcde

output:

10

result:

ok 1 number(s): "10"

Test #4:

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

input:

aaba
ba

output:

6

result:

ok 1 number(s): "6"

Test #5:

score: 0
Accepted
time: 5ms
memory: 42736kb

input:

babababaaabbaabababbbaabbbababbaaaaa
aaaabbaababbab

output:

1161

result:

ok 1 number(s): "1161"

Test #6:

score: -100
Time Limit Exceeded

input:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...

output:


result: