QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#769480#7780. Dark LaTeX vs. Light LaTeXguodong#ML 3ms18692kbC++173.3kb2024-11-21 17:52:192024-11-21 17:52:27

Judging History

你现在查看的是最新测评结果

  • [2024-11-25 20:53:52]
  • hack成功,自动添加数据
  • (/hack/1258)
  • [2024-11-21 17:52:27]
  • 评测
  • 测评结果:ML
  • 用时:3ms
  • 内存:18692kb
  • [2024-11-21 17:52:19]
  • 提交

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;
}

詳細信息

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

result: