QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#697840 | #7780. Dark LaTeX vs. Light LaTeX | 123456zmy | TL | 1ms | 4056kb | C++17 | 3.2kb | 2024-11-01 16:00:43 | 2024-11-01 16:00:45 |
Judging History
answer
#include<bits/stdc++.h>
#define int long long
using namespace std;
mt19937_64 gen(chrono::system_clock::now().time_since_epoch().count());
const int mod = (int)1e16 + gen() % (int)1e16, base = gen() % 100 + 100;
vector<int> b{ 1 };
struct Hash {
vector<int> h{ 0 };
void append(auto& s) {
for (auto x : s)
h.push_back((h.back() * base + x) % mod);
for (int i = b.size(); i <= s.size(); i++)
b.push_back((b.back() * base) % mod);
}
int query(int l, int r) {
if (l > r || l < 1 || r >= h.size())
return gen();
int x = h[r] - (__int128)h[l - 1] * b[r - l + 1] % mod;
return x + (x < 0) * mod;
}
Hash() {}
Hash(auto& s) {
append(s);
}
};
void solve()
{
auto lcp = [&](Hash& a, int x, Hash& b, int y) {
// ?????????0
int l = 0, r = a.h.size();
while (l < r) {
int mid = (l + r + 1) / 2;
if (a.query(x, x + mid - 1) == b.query(y, y + mid - 1))
l = mid;
else
r = mid - 1;
}
return l;
};
auto lcs = [&](Hash& a, int x, Hash& b, int y) {
// ?????????0
int l = 0, r = a.h.size();
while (l < r) {
int mid = (l + r + 1) / 2;
if (a.query(x - mid + 1, x) == b.query(y - mid + 1, y))
l = mid;
else
r = mid - 1;
}
return l;
};
string s,t;
cin>>s>>t;
Hash hs(s),ht(t);
s=" "+s,t=" "+t;
vector<vector<short>>cnts(s.size()+1,vector<short>(s.size()+1));
vector<vector<short>>cntt(t.size()+1,vector<short>(t.size()+1));
vector<vector<short>>anss=cnts,anst=cntt;
for(int i=1;i<s.size();i++)
{
for(int j=1;j<t.size();j++)
{
int tmp=lcp(hs,i,ht,j);
++cnts[i][i];
--cnts[i][i+tmp];
++cntt[j][j];
--cntt[j][j+tmp];
}
}
for(int i=1;i<s.size();i++)
{
for(int j=i+1;j<s.size();j++)
{
int tmp=min(j-i,lcp(hs,i,hs,j));
++anss[i][j-1];
--anss[i+1+tmp][j-1];
}
++anss[i][s.size()-1];
--anss[i+1][s.size()-1];
}
for(int i=1;i<t.size();i++)
{
for(int j=i+2;j<t.size();j++)
{
int tmp=min(j-i,lcp(ht,i,ht,j));
++anst[i+1][j-1];
--anst[i+1+tmp][j-1];
}
}
int ans=0;
for(int i=1;i<s.size();i++)
for(int j=i;j<s.size();j++)
cnts[i][j]+=cnts[i][j-1],
anss[i][j]+=anss[i-1][j],
ans+=1ll*cnts[i][j]*anss[i][j];
for(int i=1;i<t.size();i++)
for(int j=i;j<t.size();j++)
cntt[i][j]+=cntt[i][j-1],
anst[i][j]+=anst[i-1][j],
ans+=1ll*cntt[i][j]*anst[i][j];
// for(int i=1;i<s.size();i++,puts(""))
// for(int j=i;j<s.size();j++)
// printf("%d ",cnts[i][j]);
// puts("");
// for(int i=1;i<t.size();i++,puts(""))
// for(int j=i;j<t.size();j++)
// printf("%d ",cntt[i][j]);
// puts("");
// for(int i=1;i<s.size();i++,puts(""))
// for(int j=i;j<s.size();j++)
// printf("%d ",anss[i][j]);
// puts("");
// for(int i=1;i<t.size();i++,puts(""))
// for(int j=i;j<t.size();j++)
// printf("%d ",anst[i][j]);
// puts("");
printf("%lld\n",ans);
}
signed main()
{
solve();
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 3816kb
input:
abab ab
output:
8
result:
ok 1 number(s): "8"
Test #2:
score: 0
Accepted
time: 0ms
memory: 4056kb
input:
abab abaaab
output:
29
result:
ok 1 number(s): "29"
Test #3:
score: 0
Accepted
time: 0ms
memory: 3800kb
input:
abcd abcde
output:
10
result:
ok 1 number(s): "10"
Test #4:
score: 0
Accepted
time: 0ms
memory: 3840kb
input:
aaba ba
output:
6
result:
ok 1 number(s): "6"
Test #5:
score: 0
Accepted
time: 1ms
memory: 3792kb
input:
babababaaabbaabababbbaabbbababbaaaaa aaaabbaababbab
output:
1161
result:
ok 1 number(s): "1161"
Test #6:
score: -100
Time Limit Exceeded
input:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...