QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#748701 | #7780. Dark LaTeX vs. Light LaTeX | monui | TL | 43ms | 200032kb | C++23 | 2.4kb | 2024-11-14 21:07:51 | 2024-11-14 21:07:53 |
Judging History
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;
}
Details
Tip: Click on the bar to expand more detailed information
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...