QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#591439 | #7780. Dark LaTeX vs. Light LaTeX | solar_express# | TL | 7ms | 101712kb | C++23 | 3.2kb | 2024-09-26 15:56:56 | 2024-09-26 15:57:10 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
string s, t;
template<uint32_t base, uint32_t mod>
struct str_hash {
vector<uint32_t> pw, _H;
str_hash() = default;
str_hash(const string &s) : pw(s.size()), _H(s.size()) {
assert(!s.empty());
pw[0] = 1;
_H[0] = s[0];
for (size_t i = 1; i < s.size(); ++i) {
pw[i] = 1ll*pw[i-1]*base%mod;
_H[i] = (1ll*_H[i-1]*base+s[i])%mod;
}
}
uint32_t operator()(int l, int r) {
--l, --r;
if (!l) return _H[r];
return (_H[r]-1ll*_H[l-1]*pw[r-l+1]%mod+mod)%mod;
}
};
const int N = 5005;
int lcp[N];
map<uint32_t, int> cnt;
int c[N][N];
int main() {
cin.tie(0);
ios::sync_with_stdio(false);
cin >> s >> t;
str_hash<11451, 2021165639> S(s), T(t);
int64_t ans = 0;
for (int i = 1; i <= t.size(); ++i) for (int j=i;j<=t.size();++j) ++cnt[T(i,j)];
// for (int i = 1; i <= s.size(); ++i) for (int j=i;j<=s.size();++j) ans+=cnt[S(i,j)];
for (int l = 1; l <= s.size(); ++l) {
int n = s.size()-l+1;
int mx=1, pt=1; lcp[l]=n;
for (int i = 2; i <= n; ++i) {
if (i<=mx) lcp[i+l-1]=min(lcp[i-pt+l],mx-i+1);
// cerr<<i<<" "<<mx<<" "<<i+lcp[i+l-1]<<" "<<s[i+lcp[i+l-1]+l-1]<<" "<<s[l+lcp[i+l-1]]<<endl;
while(i+lcp[i+l-1]<=n && s[i+lcp[i+l-1]+l-2]==s[l+lcp[i+l-1]-1]) ++lcp[i+l-1];
if(i+lcp[i+l-1]-1>mx) pt=i, mx=i+lcp[i+l-1]-1;
}
// ++c[l][l];
++c[l][(int)s.size()];
--c[l+1][(int)s.size()];
for (int r = l+1; r<=s.size(); ++r) {
++c[l][r-1];
--c[l+1][r-1];
if(lcp[r]>0){
// cerr<<l<<" "<<r<<" "<<lcp[r]<<endl;
int rm=min(r-1,l+lcp[r]);
if(rm>=l+1){
++c[l+1][r-1];
--c[rm+1][r-1];
}
}
}
memset(lcp,0,sizeof(lcp));
// cerr<<endl;
}
for (int r = 1; r <= s.size(); ++r) {
long C = 0;
for (int l = 1; l <= r; ++l) {
C += c[l][r];
// cerr<<l<<" "<<r<<" "<<C<<" "<<cnt[S(l,r)]<<'\n';
// cerr<<ans<<endl;
ans += C * cnt[S(l,r)];
// cerr<<ans<<endl;
}
}
// cerr<<ans<<endl;
memset(c, 0, sizeof(c));
cnt.clear();
swap(s, t);
swap(S, T);
for (int i = 1; i <= t.size(); ++i) for (int j=i;j<=t.size();++j) ++cnt[T(i,j)];
for (int l = 1; l <= s.size(); ++l) {
int n = s.size()-l+1;
int mx=1, pt=1; lcp[l]=n;
for (int i = 2; i <= n; ++i) {
if (i<=mx) lcp[i+l-1]=min(lcp[i-pt+l],mx-i+1);
// cerr<<i<<" "<<mx<<" "<<i+lcp[i+l-1]<<" "<<s[i+lcp[i+l-1]+l-1]<<" "<<s[l+lcp[i+l-1]]<<endl;
while(i+lcp[i+l-1]<=n && s[i+lcp[i+l-1]+l-2]==s[l+lcp[i+l-1]-1]) ++lcp[i+l-1];
if(i+lcp[i+l-1]-1>mx) pt=i, mx=i+lcp[i+l-1]-1;
}
for (int r = l+1; r<=s.size(); ++r) {
// cerr<<l<<" "<<r<<" "<<lcp[r]<<'\n';
if(lcp[r]>0){
int rm=min(r-1,l+lcp[r]);
if(rm>=l+1){
++c[l+1][r-1];
--c[rm+1][r-1];
}
}
}
memset(lcp,0,sizeof(lcp));
// cerr<<endl;
}
for (int r = 1; r <= s.size(); ++r) {
long C = 0;
for (int l = 1; l <= r; ++l) {
C += c[l][r];
ans += C * cnt[S(l,r)];
// cerr<<l<<" "<<r<<" "<<C<<" "<<cnt[S(l,r)]<<'\n';
}
}
cout << ans << '\n';
return 0;
}
/*
abab
abaaab
*/
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 101712kb
input:
abab ab
output:
8
result:
ok 1 number(s): "8"
Test #2:
score: 0
Accepted
time: 4ms
memory: 101472kb
input:
abab abaaab
output:
29
result:
ok 1 number(s): "29"
Test #3:
score: 0
Accepted
time: 7ms
memory: 101484kb
input:
abcd abcde
output:
10
result:
ok 1 number(s): "10"
Test #4:
score: 0
Accepted
time: 7ms
memory: 101420kb
input:
aaba ba
output:
6
result:
ok 1 number(s): "6"
Test #5:
score: 0
Accepted
time: 4ms
memory: 101668kb
input:
babababaaabbaabababbbaabbbababbaaaaa aaaabbaababbab
output:
1161
result:
ok 1 number(s): "1161"
Test #6:
score: -100
Time Limit Exceeded
input:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...