QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#756073#7780. Dark LaTeX vs. Light LaTeXSuhyTL 852ms360104kbC++233.1kb2024-11-16 18:56:532024-11-16 18:56:54

Judging History

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

  • [2024-11-25 20:53:52]
  • hack成功,自动添加数据
  • (/hack/1258)
  • [2024-11-16 18:56:54]
  • 评测
  • 测评结果:TL
  • 用时:852ms
  • 内存:360104kb
  • [2024-11-16 18:56:53]
  • 提交

answer

#include <bits/stdc++.h>
#define ll long long
#define ull unsigned ll
#pragma GCC optimize(3)

using namespace std;

const int maxn = 20004;
const int p1 = 30000037;
const int p2 = 30000091;
const int p3 = 28734753;
const int b1 = 91;

class Hsh
{
    public:
    static const int w = 3, inf = 1000000009;
    static const int Maxn = 10003, maxp = 33554432;
    static int pwb[Maxn][w], mp[maxp][w];
    static const int b[w], p[w];
    int n, phsh[Maxn][w];
    static void GetPow()
    {
        for(int i = 0; i < w; i ++)
        {
            pwb[0][i] = 1;
            for(int j = 1; j < Maxn; j ++)
                pwb[j][i] = 1ll * pwb[j - 1][i] * b[i] % p[i];
        }
    }
    int mns(int x, int y, int p)
        {return (x >= y) ? (x - y) : (x - y + p);}
    void Bld(int s[], int N)
    {
        n = N;
        for(int i = 1; i <= n; i ++)
            for(int j = 0; j < w; j ++)
                phsh[i][j] = (1ll * phsh[i - 1][j] * b[j] % p[j] + s[i]) % p[j];
    }
    int GetH(int l, int r, int w)
        {return mns(phsh[r][w], 1ll * phsh[l - 1][w] * pwb[r - l + 1][w] % p[w], p[w]);}
    int GetCnt(int l, int r)
    {
        int ans = inf;
        for(int i = 0; i < w; i ++)
            ans = min(ans, mp[GetH(l, r, i)][i]);
        return ans;
    }
    void ModMap(int dlt)
    {
        for(int i = 1; i <= n; i ++)
            for(int j = 1; j <= i; j ++)
                for(int k = 0; k < w; k ++)
                    mp[GetH(j, i, k)][k] += dlt;
    }
};

int Hsh::mp[Hsh::maxp][Hsh::w], Hsh::pwb[Hsh::Maxn][Hsh::w];
const int Hsh::b[Hsh::w] = {31, 37, 29}, Hsh::p[Hsh::w] = {30000037, 28983751, 30213037};

int n, m;
int s[maxn], t[maxn];
ll ans;
Hsh hs, ht;

int f[maxn], cnt[maxn];
//babaa
void wok(int dlt)
{
    for(int i = 2, l = 2 + dlt - n + 1, r = dlt; i < n; i ++, l ++)
    {
        int j = f[i - 1];
        while(j > 0 && ((i + dlt > n && (i + dlt - j <= n || j + dlt >= n)) || s[j + 1 + dlt] != s[i + dlt]))
            j = f[j];
        if(s[j + 1 + dlt] == s[i + dlt])
            j ++;
        f[i] = j;
        cnt[i] = 0;
        if(j != 0) cnt[i] ++;
        cnt[i] += cnt[j];
        if(cnt[i] && l > 1 && r - l + 1 <= m) 
            ans += cnt[i] * hs.GetCnt(l, r);
    }
}

void work(int w)
{
    ht.ModMap(1);
    for(int i = 1; i <= n; i ++)
        s[i + n] = s[i]; 
    for(int i = 1; i < n; i ++)
        wok(i);
    if(w) ht.ModMap(-1);
}

signed main()
{
    Hsh::GetPow();
    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();
    if(s[1] == 'v' - 'a' + 1)
        cout<<n<<'/'<<m<<endl;
    hs.Bld(s, n);
    ht.Bld(t, m);
    work(1);
    //cout<<"-----"<<endl;
    swap(n, m);
    for(int i = 1; i <= max(n, m); i ++)
        swap(s[i], t[i]);
    swap(hs, ht);
    work(0);
    for(int i = 1; i <= n; i ++)
        for(int j = 1; j <= i; j ++)
            ans += hs.GetCnt(j, i);
    cout<<ans<<endl;
}

詳細信息

Test #1:

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

input:

abab
ab

output:

8

result:

ok 1 number(s): "8"

Test #2:

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

input:

abab
abaaab

output:

29

result:

ok 1 number(s): "29"

Test #3:

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

input:

abcd
abcde

output:

10

result:

ok 1 number(s): "10"

Test #4:

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

input:

aaba
ba

output:

6

result:

ok 1 number(s): "6"

Test #5:

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

input:

babababaaabbaabababbbaabbbababbaaaaa
aaaabbaababbab

output:

1161

result:

ok 1 number(s): "1161"

Test #6:

score: 0
Accepted
time: 852ms
memory: 358780kb

input:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...

output:

78156256250000

result:

ok 1 number(s): "78156256250000"

Test #7:

score: 0
Accepted
time: 78ms
memory: 360104kb

input:

gzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggz...

output:

60716448

result:

ok 1 number(s): "60716448"

Test #8:

score: 0
Accepted
time: 78ms
memory: 359448kb

input:

mlmllmllmlmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmlmllml...

output:

60679828

result:

ok 1 number(s): "60679828"

Test #9:

score: -100
Time Limit Exceeded

input:

vbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvb...

output:

5000/5000

result: