Submission #1318020

#TimeUsernameProblemLanguageResultExecution timeMemory
1318020i271828Copy and Paste 3 (JOI22_copypaste3)C++20
1 / 100
1760 ms34644 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 nxt[MAX][MAX];
ll dp[MAX][MAX];
priority_queue<pii,vector<pii>,greater<pii>> pq;
set<pair<ll,int>> st;
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;
		nxt[l][l]=x;
		for (int r=l+1;r<N;r++){
			while (x-l+r<N&&(x<=r||A[x-l+r]!=A[r])) x=nxt[x][x-l+(r-1)];
			if (x-l+r>=N) x=N;
			nxt[l][r]=x;
		}
	}
	for (int l=N-1;l>=0;l--){
		while (pq.size()) pq.pop();
		st.clear();
		for (int r=l;r<N;r++){
			dp[l][r]=dp[l+1][r]+CA;
			while (pq.size()&&pq.top().first<=r){
				auto [_,x]=pq.top();
				pq.pop();
				pq.push({nxt[r-x+l][r]-l+x,x});
				st.erase({V[x],x});
				V[x]+=CC-(x-l+1)*CA;
				st.insert({V[x],x});
			}
			if (st.size()){
				dp[l][r]=min(dp[l][r],(r-l+1)*CA+st.begin()->first);
			}
			V[r]=dp[l][r]+CB+CC-(r-l+1)*CA;
			st.insert({V[r],r});
			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...