QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#712263#9514. 研心zjy000120 159ms100288kbC++204.6kb2024-11-05 15:06:252024-11-05 15:06:26

Judging History

This is the latest submission verdict.

  • [2024-11-05 15:06:26]
  • Judged
  • Verdict: 20
  • Time: 159ms
  • Memory: 100288kb
  • [2024-11-05 15:06:25]
  • Submitted

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...

output:


result: