QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#712263 | #9514. 研心 | zjy0001 | 20 | 159ms | 100288kb | C++20 | 4.6kb | 2024-11-05 15:06:25 | 2024-11-05 15:06:26 |
Judging History
answer
#include<bits/stdc++.h>
#define LL long long
#define LLL __int128
#define uint unsigned
#define ldb long double
#define uLL unsigned long long
using namespace std;
const int N=4e5+5,BL=5000;
const int B=233,P=998244353;
int n,m;
LL ans;
int pwB[N];
int SF[N],TF[N];
string S[N],T[N];
vector<int>SQ[N],TQ[N];
vector<tuple<int,int,int>>Q[N];
vector<int>preS[N],sufS[N],preT[N],sufT[N];
struct Trie{
int n,tim;
vector<int>gap[N];
vector<pair<int,int>>G[N];
int T[N][26],dL[N],dR[N],pos[N],W[N],rk[N],ed[N],d[N];
Trie(){n=1;}
inline void ins(string s,vector<int>q,int id){
int p=1;
for(int i=0;i<s.length();++i){
const int c=s[i]-'a';
if(!T[p][c])T[p][c]=++n;
p=T[p][c];
if(i%2==0&&q[i/2])W[p]=1;
}
++ed[p],pos[id]=p;
}
inline void dfs(int u){
gap[d[u]].emplace_back(u);
rk[dL[u]=++tim]=u;
for(int i=0;i<26;++i)if(T[u][i])
G[u].emplace_back(T[u][i],i),d[T[u][i]]=d[u]+1,dfs(T[u][i]);
dR[u]=tim;
}
}SE,TE;
struct segtree{
int s[N*4],ad[N*4],mn[N*4];
inline void build(int p,int l,int r){
mn[p]=0,ad[p]=0;
if(l==r)return s[p]=SE.ed[SE.rk[l]],void();
const int mid=(l+r)>>1,ls=p*2,rs=p*2+1;
build(ls,l,mid),build(rs,mid+1,r);
s[p]=s[ls]+s[rs];
}
inline void upd(int p,int l,int r,int x,int y,int z){
if(x<=l&&r<=y)return ad[p]+=z,mn[p]+=z,void();
const int mid=(l+r)>>1,ls=p*2,rs=p*2+1;
if(ad[p])ad[ls]+=ad[p],mn[ls]+=ad[p],ad[rs]+=ad[p],mn[rs]+=ad[p],ad[p]=0;
if(x<=mid)upd(ls,l,mid,x,y,z);
if(mid<y)upd(rs,mid+1,r,x,y,z);
mn[p]=min(mn[ls],mn[rs]),s[p]=(mn[ls]==mn[p]?s[ls]:0)+(mn[rs]==mn[p]?s[rs]:0);
}
}tr;
inline int Spre(int x,int l,int r){
return (preS[x][r+1]+1ll*preS[x][l]*(P-pwB[r-l+1]))%P;
}
inline int Ssuf(int x,int l,int r){
return (sufS[x][l]+1ll*sufS[x][r+1]*(P-pwB[r-l+1]))%P;
}
inline int Tpre(int x,int l,int r){
return (preT[x][r+1]+1ll*preT[x][l]*(P-pwB[r-l+1]))%P;
}
inline int Tsuf(int x,int l,int r){
return (sufT[x][l]+1ll*sufT[x][r+1]*(P-pwB[r-l+1]))%P;
}
signed main(){
cin.tie(0)->sync_with_stdio(0);
cin>>n>>m;
pwB[0]=1;
for(int i=1;i<N;++i)pwB[i]=1ll*pwB[i-1]*B%P;
for(int i=0;i<n;++i)cin>>S[i];
for(int i=0;i<m;++i)cin>>T[i];
for(int i=0;i<n;++i){
preS[i].resize(S[i].length()+1);
sufS[i].resize(S[i].length()+1);
SQ[i].resize(S[i].length());
for(int j=0;j<S[i].length();++j)preS[i][j+1]=(1LL*preS[i][j]*B+S[i][j])%P;
for(int j=S[i].length();j--;)sufS[i][j]=(1LL*sufS[i][j+1]*B+S[i][j])%P;
for(int j=0;j<S[i].length();++j){
int z=0;
for(int l=1,r=min(j+1,(int)S[i].length()-j);l<=r;){
const int mid=(l+r)>>1;
if(Spre(i,j-mid+1,j)==Ssuf(i,j,j+mid-1))z=mid,l=mid+1;
else r=mid-1;
}
SF[i]=max(SF[i],z);
if(z==S[i].length()-j)SQ[i][j]=1;
}
}
for(int i=0;i<m;++i){
preT[i].resize(T[i].length()+1);
sufT[i].resize(T[i].length()+1);
TQ[i].resize(T[i].length());
for(int j=0;j<T[i].length();++j)preT[i][j+1]=(1LL*preT[i][j]*B+T[i][j])%P;
for(int j=T[i].length();j--;)sufT[i][j]=(1LL*sufT[i][j+1]*B+T[i][j])%P;
for(int j=0;j<T[i].length();++j){
int z=0;
for(int l=1,r=min(j+1,(int)T[i].length()-j);l<=r;){
const int mid=(l+r)>>1;
if(Tpre(i,j-mid+1,j)==Tsuf(i,j,j+mid-1))z=mid,l=mid+1;
else r=mid-1;
}
TF[i]=max(TF[i],z);
if(z==j+1)TQ[i][j]=1;
}
}
for(int i=0;i<n;++i)
SE.ins(string(S[i].rbegin(),S[i].rend()),vector<int>(SQ[i].rbegin(),SQ[i].rend()),i);
for(int i=0;i<m;++i)
TE.ins(T[i],TQ[i],i);
SE.dfs(1),TE.dfs(1);
vector<pair<int,int>>cur;
for(int i=0;i<m;++i)cerr<<TE.dL[TE.pos[i]]<<endl;
for(int i=1;i<=BL;++i){
for(int j=0;j<n;++j)if(SF[j]>=i)
Q[TE.dL[1]].emplace_back(SE.dL[SE.pos[j]],SE.dL[SE.pos[j]],1);
for(int j=0;j<m;++j)if(TF[j]>=i)
Q[TE.dL[TE.pos[j]]].emplace_back(SE.dL[1],SE.dR[1],1),
Q[TE.dL[TE.pos[j]]+1].emplace_back(SE.dL[1],SE.dR[1],-1);
vector<pair<int,int>>nxt;
for(auto [x,y]:cur)for(auto [z,c]:SE.G[x])if(TE.T[y][c])nxt.emplace_back(z,TE.T[y][c]);
if(i>1){
for(auto u:SE.gap[i+i-3])if(SE.W[u])for(auto [v,c]:SE.G[u])if(TE.T[1][c])nxt.emplace_back(v,TE.T[1][c]);
for(auto u:TE.gap[i+i-3])if(TE.W[u])for(auto [v,c]:TE.G[u])if(SE.T[1][c])nxt.emplace_back(SE.T[1][c],v);
}
sort(nxt.begin(),nxt.end()),nxt.erase(unique(nxt.begin(),nxt.end()),nxt.end());
for(auto [x,y]:nxt)Q[TE.dL[y]].emplace_back(SE.dL[x],SE.dR[x],1),Q[TE.dR[y]+1].emplace_back(SE.dL[x],SE.dR[x],-1);
tr.build(1,1,SE.n);
for(int j=1;j<=TE.n;++j){
for(auto [l,r,v]:Q[j])tr.upd(1,1,SE.n,l,r,v);
ans+=TE.ed[TE.rk[j]]*(n-(tr.mn[1]?0:tr.s[1])),Q[j].clear();
}
cur=nxt;
}
cout<<ans;
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Subtask #1:
score: 20
Accepted
Test #1:
score: 20
Accepted
time: 159ms
memory: 97252kb
input:
10 100 aabaababaaaababbabaaaababaababbbaabbbaabaabaabbbaababaaababbaababababbbaababbbbbbbbaabbbbaabbbbbbbbaabaabbbaabbbbbabbbbbaabbbaabaa bbaaabaabbbbaaabaaaaabbbbbabaabbabbaabbaabbaabbabbababaabaabbaabbbbbbaaaabbbbabaaaabaaabbbabaaaaaabbaaaabbbabbbbbaaaabbabaababbaabbaaabbbbbbaaaabbbababaabbaaaba b...
output:
10468
result:
ok single line: '10468'
Test #2:
score: 20
Accepted
time: 153ms
memory: 100288kb
input:
10 100 abbacbbaabababcaabbaabbbabcaccabcabbabbbccaacabaabacccbacaaabbaaabbbaacaabbabcabbbcbacaaaaabaaaabaaacbbccbacacbbaaccacbabcbccacbaaacaaacccbabbaccacaaacaabbbccaaccbbabaabcbbcbcbb bccabcacbacccbcababaccccaaabbccacaccccabbaabbcacabaccabacbbbaaaabaabccbcaacaaccbcacabcbbbcccccabccbaababccccabcabab...
output:
6384
result:
ok single line: '6384'
Test #3:
score: 20
Accepted
time: 159ms
memory: 100064kb
input:
50 50 aaaaabbabbbbbaababbaaaababaababababbbbaabaaaaaaaabaabbaaabaaaabaaabaabbbabbbababbbbabbbabbaaababbabaabbabbabbabbaaababaaaaabbbbbbaabaabaabbbbbabaaababb abbabbbaabaaaaabababaabbabaabbbbab bababbbbaabaabbaabbbbaabaabbbaabbbbaaabbabbbaaabbbbaaabaabbaaaaaabbbabaaaaabbaabaabaaabaaababbbbbaaabbbbbba...
output:
21362
result:
ok single line: '21362'
Test #4:
score: 20
Accepted
time: 154ms
memory: 100268kb
input:
50 50 aababcabbbcbaacaaaaccababbacbbaaabcbaaccabbababbcccaacaaaacacbcbaaabaacabbbbbbaccaaacbbacaacacbcccbbacabbcbcbacababcbbacaccaacacbcccbababaccabccccbabaccababccccbcbabcabcabccaaccababcbccacbbaaaacc cbaccababccbaaacbccabbcccacacacaaaabaaababcacabaccbccacbcbaaaaabbacbbaccabba ccbcbcacbcaccabbbccaa...
output:
13421
result:
ok single line: '13421'
Test #5:
score: 20
Accepted
time: 61ms
memory: 95860kb
input:
1000 1000 a aabbab bbbbababbbba bb baaaaa ba a baa a bbaaaabaaaba ba a a a bbababbbbbb b aaabb bbbbbaabbabab bbaaa aaaa aa aaaaaababb a bbaba baaa aabbab babaab b aab bbbabb aaaabbbbbaaaaaa bbbbbbbaabab bb ab aaa aaababb babaaaabab aa aaabaaababa abbabaaaaabb bbaa abaabb baa abba aaaa abbbb aab b aa...
output:
3159935
result:
ok single line: '3159935'
Subtask #2:
score: 0
Time Limit Exceeded
Test #6:
score: 0
Time Limit Exceeded
input:
1 10000 bcacacbcdadbcbccbdddaaddabcaccccbaabbcdcdaabdacccadacbbbabdaaacadacdccadcbdadadcaaabdbdbdcdcccbacbdbccacbdadcaaaacbabdadcacdcacadcadaabdaaabccccdcbcdbcadcaabbbaacaadaccdaccadbddcdbccbcddcaadcaadaadbbaadbcdbddbcbadbccbaddaacabcdccbadaddcadcbababccabcaadbcbdbcbbcdcbdbcdbdaaddbacddcabbbdccbddba...
output:
result:
Subtask #3:
score: 0
Time Limit Exceeded
Test #12:
score: 0
Time Limit Exceeded
input:
100 1000 abbabbbbabbbbabaabaabbbbabaaabbbaabaabbabaabaabbaabbaabbababbabbababbbaabaabbaabbbabaabbbaaaabaaaabaababbaaaaaaaaabaabbaababbbbbbabbbabbbbababbbaaaaaabaaaabaaabbabbaaaaabbbabbabaabbabababbaaababbbaaaabbabbbabbabbabbbbbbabaabaabbbaabaaabbaabbabbbbaabbabaaabaabaabbbabbbbbabaababbbabababaabbba...
output:
result:
Subtask #4:
score: 0
Time Limit Exceeded
Test #17:
score: 0
Time Limit Exceeded
input:
100 1000 bcbccabbbabacabaabbccbaaabbbbcbbbaaaacaaabbccbababbacbbabbbaccccccccbccabcaacbbccbbbbcaaacabcccaccbaacccbcbaaaccbcaaaaaaaabccaaaacccbabacbcababbacbbbcaabaaacbbcaccbaccccbbcbacabaacbcaccacbcbcbbcbccccbbcacccaabbabcaabbacabaaacccbbcbccbabbcbccbcbbbabbaabacbccbacababbacbababbbaacccacbabcabcaba...