QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#736038 | #7780. Dark LaTeX vs. Light LaTeX | Suhy | TL | 0ms | 3764kb | C++17 | 3.1kb | 2024-11-11 23:43:32 | 2024-11-11 23:43:32 |
Judging History
answer
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned ll
#pragma GCC optimize(3)
using namespace std;
const int maxn = 5003;
const int b1 = 31;
const int b2 = 37;
int n, m;
int s[maxn], t[maxn];
ull ps1[maxn], ps2[maxn], pt1[maxn], pt2[maxn];
unordered_map <ull, int> mp1;
ull pwb1[maxn], pwb2[maxn];
ll ans;
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)
{
ull hsh1 = ps1[r + dlt] - ps1[l - 1 + dlt] * pwb1[(r - l + 1)];
//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()
{
mp1.clear();
for(int i = 1; i <= m; i ++)
{
for(int j = 1; j <= i; j ++)
{
mp1[pt1[i] - 1ll * pt1[j - 1] * pwb1[(i - j + 1)]] ++;
//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] = ps1[i - 1] * b1 + s[i];
//ps2[i] = (1ll * ps2[i - 1] * b2 % p2 + s[i]) % p2;
}
for(int i = 1; i <= m; i ++)
{
pt1[i] = pt1[i - 1] * b1 + t[i];
//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;
//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 ++)
{
ull hsh1 = ps1[i] - ps1[j - 1] * pwb1[(i - j + 1)];
//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: 0ms
memory: 3580kb
input:
abab ab
output:
8
result:
ok 1 number(s): "8"
Test #2:
score: 0
Accepted
time: 0ms
memory: 3760kb
input:
abab abaaab
output:
29
result:
ok 1 number(s): "29"
Test #3:
score: 0
Accepted
time: 0ms
memory: 3764kb
input:
abcd abcde
output:
10
result:
ok 1 number(s): "10"
Test #4:
score: 0
Accepted
time: 0ms
memory: 3756kb
input:
aaba ba
output:
6
result:
ok 1 number(s): "6"
Test #5:
score: 0
Accepted
time: 0ms
memory: 3548kb
input:
babababaaabbaabababbbaabbbababbaaaaa aaaabbaababbab
output:
1161
result:
ok 1 number(s): "1161"
Test #6:
score: -100
Time Limit Exceeded
input:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...