QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#748701#7780. Dark LaTeX vs. Light LaTeXmonuiTL 43ms200032kbC++232.4kb2024-11-14 21:07:512024-11-14 21:07:53

Judging History

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

  • [2024-11-25 20:53:52]
  • hack成功,自动添加数据
  • (/hack/1258)
  • [2024-11-14 21:07:53]
  • 评测
  • 测评结果:TL
  • 用时:43ms
  • 内存:200032kb
  • [2024-11-14 21:07:51]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl "\n"
#define lowbit(x) x&(-x)
const int N=5010;
const int M1 = 1e9+9;
const int M2 = 998244351;
const int P1 = 131;
const int P2 = 1331;
string a,b;     
map<pair<int, int>,int> st_a,st_b;
int na,nb;

int hash_a1[N],hash_b1[N];
int hash_a2[N],hash_b2[N];
int fac1[N], fac2[N];
void init_init(){
    fac1[0]=1;
    fac2[0] = 1;
    for(int i=1;i<N;i++){
        fac1[i]=(fac1[i-1]*P1)%M1;
        fac2[i]=(fac2[i-1]*P2)%M2;
    }
}

void init(string& s,int len,int* ans, int M, int P){
    for(int i=1;i<=len;i++){
        ans[i]=ans[i-1]*P+s[i]-'a'+1;
        ans[i]%=M;
    }
}

void calc(string& s,int len,map<pair<int,int>,int>& st,int* ans1, int* ans2,int d){
    vector<vector<int>> op(N,vector<int>(N,0));
    vector<int> lst(N,0);
    for(int i=1;i<=len;i++){
        for(int j=len; j > i; j--){
        	lst[j]=0;
            if(s[i]!=s[j]) continue;
            if(s[i-1]==s[j-1]) lst[j]=lst[j-1]+1;
            op[i+1][j]-=1;
            op[i+1][max(j-lst[j]-1,i+1)]+=1;
        }
    }
    for(int i=1;i<=len;i++){
    	int res=0;
        for(int j=i;j<=len;j++){
        	res+=op[i][j];
            int num=res+d;
            int to1=ans1[j]-ans1[i-1]*fac1[j-i+1]%M1;
            int to2=ans2[j]-ans2[i-1]*fac2[j-i+1]%M2;
            to1=(to1%M1+M1)%M1;
            to2=(to2%M2+M2)%M2;
            pair<int,int> pr = {to1, to2};
            st[pr]+=num;
        }
    }
}

int getans(string& s,int len,map<pair<int,int>,int>& st,int* ans1, int* ans2){
    int res=0;
    for(int i=1;i<=len;i++){
        for(int j=i;j<=len;j++){
            int to1=ans1[j]-ans1[i-1]*fac1[j-i+1]%M1;
            int to2=ans2[j]-ans2[i-1]*fac2[j-i+1]%M2;
            to1=(to1%M1+M1)%M1;
            to2=(to2%M2+M2)%M2;
            res+=st[{to1,to2}];
        }
    }
    return res;
}

void solve(){
    cin>>a>>b;
    na=a.size(),nb=b.size();
    a="#"+a;b="#"+b;

    init_init();
    init(a,na,hash_a1,M1,P1);
    init(a,na,hash_a2,M2,P2);
    init(b,nb,hash_b1,M1,P1);
    init(b,nb,hash_b2,M2,P2);
    calc(a,na,st_a,hash_a1,hash_a2,1);
    calc(b,nb,st_b,hash_b1,hash_b2,0);
    int res=getans(a,na,st_b,hash_a1,hash_a2)+getans(b,nb,st_a,hash_b1,hash_b2);
    cout<<res<<endl;
}
signed main()
{
    ios::sync_with_stdio(0);cin.tie(0);
    int t=1;
    // cin>>t;
    while(t--)
        solve();
    return 0;
}

详细

Test #1:

score: 100
Accepted
time: 27ms
memory: 200032kb

input:

abab
ab

output:

8

result:

ok 1 number(s): "8"

Test #2:

score: 0
Accepted
time: 23ms
memory: 199968kb

input:

abab
abaaab

output:

29

result:

ok 1 number(s): "29"

Test #3:

score: 0
Accepted
time: 41ms
memory: 200000kb

input:

abcd
abcde

output:

10

result:

ok 1 number(s): "10"

Test #4:

score: 0
Accepted
time: 43ms
memory: 199964kb

input:

aaba
ba

output:

6

result:

ok 1 number(s): "6"

Test #5:

score: 0
Accepted
time: 15ms
memory: 200032kb

input:

babababaaabbaabababbbaabbbababbaaaaa
aaaabbaababbab

output:

1161

result:

ok 1 number(s): "1161"

Test #6:

score: -100
Time Limit Exceeded

input:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...

output:


result: