QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#312654 | #7780. Dark LaTeX vs. Light LaTeX | confesser | WA | 803ms | 397364kb | C++17 | 2.1kb | 2024-01-24 09:44:51 | 2024-01-24 09:44:51 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
using vi=vector<int>;
using pi=pair<int,int>;
#define F(i,a,b) for(int i=(a);i<=(b);i++)
#define G(i,a,b) for(int i=(a);i>=(b);i--)
#define ms(a,b) memset(a,b,sizeof(a))
#define si(a) ((int)(a).size())
#define all(a) (a).begin(),(a).end()
#define fi first
#define se second
#define pb push_back
const int N=1e4+3;
char a[N],b[N],c[N];
int cnt[N][N];
struct SA{
char s[N];
int n,sa[N],rk[N],ht[N],mn[N][22];
void init(char *s,int nn){
n=nn;
static int cnt[N],sa0[N],rk0[N],h[N];
ms(cnt,0),ms(sa,0),ms(rk,0);
F(i,1,n) sa[i]=i;
sort(sa+1,sa+n+1,[&](int x,int y){return s[x]<s[y];});
F(i,1,n) rk[sa[i]]=rk[sa[i-1]]+(s[sa[i-1]]!=s[sa[i]]);
for(int p=1;p<n;p*=2){
F(i,1,n) cnt[rk[sa[i]]]=i;
G(i,n,1) if(sa[i]>p) sa0[cnt[rk[sa[i]-p]]--]=sa[i]-p;
G(i,n,n-p+1) sa0[cnt[rk[i]]--]=i;
F(i,1,n) sa[i]=sa0[i];
F(i,1,n) rk0[sa[i]]=rk0[sa[i-1]]+(rk[sa[i-1]]!=rk[sa[i]]||rk[sa[i-1]+p]!=rk[sa[i]+p]);
F(i,1,n) rk[i]=rk0[i];
}
F(i,1,n){
int j=sa[rk[i]-1],k=max(0,h[i-1]-1);
while(i+k<=n&&j+k<=n&&s[i+k]==s[j+k]) k++;
h[i]=ht[rk[i]]=k;
}
F(i,1,n) mn[i][0]=ht[i];
F(j,1,20) F(i,1,n-(1<<j)+1) mn[i][j]=min(mn[i][j-1],mn[i+(1<<(j-1))][j-1]);
}
int qry(int l,int r){
int k=__lg(r-l+1);
return min(mn[l][k],mn[r-(1<<k)+1][k]);
}
int lcp(int x,int y){
if(x==y)return n-x+1;
if(rk[x]>rk[y])swap(x,y);
return qry(rk[x]+1,rk[y]);
}
}A,B,C;
int main(){
cin.tie(0)->ios::sync_with_stdio(0);
cin>>(a+1)>>(b+1);
int ans=0;
auto slv=[&](int flg){
int n=strlen(a+1),m=strlen(b+1);
A.init(a,n);
B.init(b,m);
F(i,1,n) c[i]=a[i];
c[n+1]='#';
F(i,1,m) c[n+1+i]=b[i];
C.init(c,n+m+1);
ms(cnt,0);
F(i,1,m) F(j,1,m){
int k=B.lcp(i,j);
cnt[i][j]++;
cnt[i+k][j]--;
}
F(i,1,m) F(j,1,m) cnt[i][j]+=cnt[i-1][j];
// F(i,1,m) F(j,1,m) cout<<cnt[i][j]<<" \n"[j==m];
F(i,1,m) F(j,1,m) cnt[i][j]+=cnt[i][j-1];
F(i,1,n) F(j,1,m){
int k=C.lcp(i,n+1+j);
if(j-1<=min(j+k,m)){
ans+=cnt[j-1][min(j+k,m)]-cnt[j-1][j]+k*flg;
}
}
};
slv(0);
swap(a,b);
slv(1);
cout<<ans;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 44ms
memory: 396388kb
input:
abab ab
output:
8
result:
ok 1 number(s): "8"
Test #2:
score: 0
Accepted
time: 44ms
memory: 395860kb
input:
abab abaaab
output:
29
result:
ok 1 number(s): "29"
Test #3:
score: 0
Accepted
time: 46ms
memory: 397216kb
input:
abcd abcde
output:
10
result:
ok 1 number(s): "10"
Test #4:
score: 0
Accepted
time: 48ms
memory: 396148kb
input:
aaba ba
output:
6
result:
ok 1 number(s): "6"
Test #5:
score: 0
Accepted
time: 43ms
memory: 397004kb
input:
babababaaabbaabababbbaabbbababbaaaaa aaaabbaababbab
output:
1161
result:
ok 1 number(s): "1161"
Test #6:
score: -100
Wrong Answer
time: 803ms
memory: 397364kb
input:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...
output:
736364688
result:
wrong answer 1st numbers differ - expected: '78156256250000', found: '736364688'