QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#769480 | #7780. Dark LaTeX vs. Light LaTeX | guodong# | ML | 3ms | 18692kb | C++17 | 3.3kb | 2024-11-21 17:52:19 | 2024-11-21 17:52:27 |
Judging History
answer
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e3+5;
string s,t;
int a[N][N],b[N][N],f[N][N],g[N][N];
int sa[N*20],height[N*20];
int rk[N*20],oldrk[N*20];
void strsort(string s,int l1,int l2){
int n=s.length();
for(int i=1; i<=n; i++)sa[i]=i,rk[i]=s[i-1];
s = "0" + s;
s.resize(s.length() + 20);
for(int w=1; w<n; w<<=1){
sort(sa+1,sa+n+1,[&](int x,int y){
return rk[x]==rk[y]?rk[x+w]<rk[y+w]:rk[x]<rk[y];
});
memcpy(oldrk,rk,sizeof(rk));
for(int p=0,i=1; i<=n; i++){
if(oldrk[sa[i]]==oldrk[sa[i-1]]&&oldrk[sa[i]+w]==oldrk[sa[i-1]+w]){
rk[sa[i]]=p;
}else{
rk[sa[i]]=++p;
}
}
}
for(int i=1,k=0; i<=n; i++){
if(rk[i]==0)continue;
if(k)--k;
while(i + k <= n && s[i+k]==s[sa[rk[i]-1]+k])++k;
height[rk[i]]=k;
}
// for(int i=2; i<=n; i++)cout<<"#"<<sa[i-1]<<' '<<sa[i]<<' '<<height[i]<<endl;
for(int i=1; i<=n; i++){
int h=N;
for(int j=i+1; j<=n; j++){
h=min(h,height[j]);
// cout<<sa[i]<<' '<<sa[j]<<' '<<h<<endl;
if(sa[i]<=l1){
if(sa[j]<=l1){
f[sa[i]][sa[j]]=min(h,min(l1-sa[i]+1,l1-sa[j]+1));
f[sa[j]][sa[i]]=f[sa[i]][sa[j]];
}else{
int len=min(h,l1-sa[i]+1);
a[sa[i]][len]++;
b[sa[j]-l1][len]++;
}
}else{
if(sa[j]<=l1){
int len=min(h,l1-sa[j]+1);
a[sa[j]][len]++;
b[sa[i]-l1][len]++;
}else{
g[sa[i]-l1][sa[j]-l1]=h;
g[sa[j ]-l1][sa[i]-l1]=h;
}
}
}
}
}
// const int
signed main(){
#ifdef NICEGUODONG
freopen("data.in","r",stdin);
#endif
cin>>s;
cin>>t;
int ans=0;
int lens=s.length(),lent=t.length();
strsort(s+t,lens,lent);
// cout<<endl;
for(int i=1; i<=lens; i++){
for(int j=lens-i+1; j>=1; j--){
a[i][j]+=a[i][j+1];
// cout<<i<<' '<<j<<' '<<a[i][j]<<' '<<endl;
ans+=a[i][j];
}
}
for(int i=1; i<=lens; i++){
for(int j=1; j<=lens-i+1; j++){
a[i][j]+=a[i-1][j+1];
}
}
for(int i=1; i<=lent; i++){
for(int j=lent-i+1; j>=1; j--){
b[i][j]+=b[i][j+1];
// cout<<i<<' '<<j<<' '<<b[i][j]<<' '<<endl;
}
}
for(int i=1; i<=lent; i++){
for(int j=1; j<=lent-i+1; j++){
b[i][j]+=b[i-1][j+1];
}
}
// cout << ans << '\n';
for(int i=1; i<=lens; i++){
for(int j=i+1; j<=lens; j++){
int x=min(i+f[i][j],j-1),y=i;
if(x<=y)continue;
// cout<<i<<' '<<j<<' '<<a[x][j-x]-a[y][j-y]<<endl;
ans+=a[x][j-x]-a[y][j-y];
}
}
for(int i=1; i<=lent; i++){
for(int j=i+1; j<=lent; j++){
int x=min(i+g[i][j],j-1),y=i;
if(x<=y)continue;
ans+=b[x][j-x]-b[y][j-y];
}
}
cout<<ans;
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 3ms
memory: 16092kb
input:
abab ab
output:
8
result:
ok 1 number(s): "8"
Test #2:
score: 0
Accepted
time: 0ms
memory: 12552kb
input:
abab abaaab
output:
29
result:
ok 1 number(s): "29"
Test #3:
score: 0
Accepted
time: 0ms
memory: 14536kb
input:
abcd abcde
output:
10
result:
ok 1 number(s): "10"
Test #4:
score: 0
Accepted
time: 0ms
memory: 12552kb
input:
aaba ba
output:
6
result:
ok 1 number(s): "6"
Test #5:
score: 0
Accepted
time: 3ms
memory: 18692kb
input:
babababaaabbaabababbbaabbbababbaaaaa aaaabbaababbab
output:
1161
result:
ok 1 number(s): "1161"
Test #6:
score: -100
Memory Limit Exceeded
input:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...
output:
78156256250000