Submission #1318337

#TimeUsernameProblemLanguageResultExecution timeMemory
1318337i271828Copy and Paste 3 (JOI22_copypaste3)C++20
100 / 100
2642 ms247984 KiB
#include <bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
using namespace std;

const int MAX=2505;
const int LOG=15;

int N;
ll CA,CB,CC;
int A[MAX];
int up[MAX][MAX][LOG];
int nxt[MAX][MAX];
ll dp[MAX][MAX];
priority_queue<pii,vector<pii>,greater<pii>> pq;
ll V[MAX];

int main(){
	ios::sync_with_stdio(0);cin.tie(0);
	cin>>N;
	for (int i=0;i<N;i++){
		char c;cin>>c;
		A[i]=c-'a';
	}
	cin>>CA>>CB>>CC;
	for (int l=N-1;l>=0;l--){
		int x;
		for (x=l+1;x<N;x++) if (A[x]==A[l]) break;
		up[l][l][0]=x;
		for (int r=l+1;r<N;r++){
			while (x-l+r<N&&A[x-l+r]!=A[r]) x=up[x][x-l+(r-1)][0];
			if (x-l+r>=N) x=N;
			up[l][r][0]=x;
		}
	}
	for (int k=1;k<LOG;k++) for (int l=0;l<N;l++) for (int r=l;r<N;r++){
		int x=up[l][r][k-1];
		if (x>=N) up[l][r][k]=N;
		else up[l][r][k]=up[x][x-l+r][k-1];
	}
	for (int l=0;l<N;l++){
		for (int r=l;r<N;r++){
			int x=l;
			for (int k=LOG-1;k>=0;k--) if (x-l+r<N&&up[x][x-l+r][k]<=r) x=up[x][x-l+r][k];
			nxt[l][r]=up[x][x-l+r][0];
		}
	}
	for (int l=N-1;l>=0;l--){
		while (pq.size()) pq.pop();
		for (int r=l;r<N;r++){
			dp[l][r]=min(dp[l+1][r]+CA,dp[l][r-1]+CA);
			while (pq.size()&&pq.top().first<=r){
				auto [_,x]=pq.top();
				pq.pop();
				pq.push({nxt[r-x+l][r]-l+x,x});
				V[x]+=CC-(x-l+1)*CA;
				dp[l][r]=min(dp[l][r],(r-l+1)*CA+V[x]);
			}
			V[r]=dp[l][r]+CB+CC-(r-l+1)*CA;
			pq.push({nxt[l][r]-l+r,r});
		}
	}
	cout<<dp[0][N-1]<<'\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...