QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#627312#7780. Dark LaTeX vs. Light LaTeXCCFML 0ms0kbC++142.3kb2024-10-10 15:31:032024-10-10 15:31:04

Judging History

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

  • [2024-11-25 20:53:52]
  • hack成功,自动添加数据
  • (/hack/1258)
  • [2024-10-10 15:31:04]
  • 评测
  • 测评结果:ML
  • 用时:0ms
  • 内存:0kb
  • [2024-10-10 15:31:03]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define pii pair<int,int>
#define fs first
#define sc second
#define pb push_back
#define endl
#define SZ(X) (int)((X).size())
#define lb(i) ((i)&-(i))
#define cl(i) memset(i,0,sizeof(i))
const int N=6.1e3;
const ll mod=1234567891;
char s[N],t[N];
int qp(int a,int b){
    int res=1;
    while(b){
        if(b&1)res=(ll)res*a%mod;
        a=(ll)a*a%mod,b/=2;
    }
    return res;
}
#define inv(i) qp(i,mod-2)
int lcp0[N][N],lcp1[N][N];
ll cnt[N][N];//cnt i j s[i..j] as B(in ABA)
ll calc(){
    int n=strlen(s+1),m=strlen(t+1);
    for(int j=n;j>=0;j--){
        for(int i=1;i<=j;i++){
            if(s[i]!=s[j])lcp0[i][j]=0;
            else lcp0[i][j]=1+lcp0[i+1][j+1];
        }
    }
    for(int i=n;i>=0;i--){
        for(int j=1;j<=m;j++){
            if(s[i]!=t[j])lcp1[i][j]=0;
            else lcp1[i][j]=1+lcp1[i+1][j+1];
        }
    }/*
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++)cerr<<lcp1[i][j]<<" ";
        cerr<<"\n";
    }*/
    for(int i=1;i<=n;i++){
        for(int j=i+1;j<=n+1;j++){
            int l=min(lcp0[i][j],j-i+1);
            //[i,j-1]->[i+l,j-1] (++)
            cnt[i][j-1]++,cnt[i+l+1][j-1]--;//差分
        }
    }
    for(int j=1;j<=n;j++){
        for(int i=1;i<=j;i++)
            cnt[i][j]+=cnt[i-1][j];
    }
    ///
    /*
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++)cerr<<cnt[i][j]<<" ";
        cerr<<"\n";
    }*/
    ///

    for(int i=1;i<=n;i++){
        for(int j=i+1;j<=n;j++){
            cnt[i][j]+=cnt[i][j-1];
            //cnt'[i,j] contain [i,i]->[i,j]
        }
    }
    ll ans=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++)if(lcp1[i][j]>0){
            //[i,i]->[i,i+lcp1[i][j]] (make sum)
            //cerr<<"sum^"<<i<<" "<<i+lcp1[i][j]-1<<"|"<<j<<"\n";
            ans+=cnt[i][i+lcp1[i][j]-1]-0;
        }
    }
    return ans;
}
int main(){
    //cout<<inv(213121)*213121ll%mod;
    scanf("%s%s",s+1,t+1);
    ll ans=calc();
    cl(lcp0),cl(lcp1),cl(cnt);//
    swap(s,t);
    ans+=calc();
    //cerr<<ans<<"%\n";
    int n=strlen(s+1),m=strlen(t+1);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++)
            ans-=lcp1[i][j];//,cerr<<lcp1[i][j]<<"$";
    }
    cout<<ans<<"\n";
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Memory Limit Exceeded

input:

abab
ab

output:

8

result: