Submission #1206231

#TimeUsernameProblemLanguageResultExecution timeMemory
1206231emptypringlescanCopy and Paste 3 (JOI22_copypaste3)C++17
100 / 100
536 ms107812 KiB
#include <bits/stdc++.h>
using namespace std;
const long long mod=88888888888889;
long long dp[2505][2505],hsh[2505][2505];
int prv[2505][2505];
int n;
long long a,b,c;
int32_t main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> n;
    string s;
    cin >> s;
    cin >> a >> b >> c;
    for(int i=0; i<n; i++){
		long long cur=0;
		for(int j=i; j<n; j++){
			cur=(cur*26ll+s[j]-'a')%mod;
			hsh[i][j]=cur;
		}
	}
	memset(prv,-1,sizeof(prv));
	unordered_map<long long,pair<int,vector<int> > > oop;
	for(int i=1; i<=n; i++){
		oop.clear();
		for(int j=i-1; j<n; j++){
			long long me=hsh[j-i+1][j];
			int pt=oop[me].first;
			while(pt<(int)oop[me].second.size()&&oop[me].second[pt]<j-i+1){
				pt++;
			}
			if(pt!=0) prv[j-i+1][j]=oop[me].second[pt-1];
			oop[me].first=pt;
			oop[me].second.push_back(j);
		}
	}
	for(int i=0; i<n; i++) for(int j=0; j<n; j++) dp[i][j]=1e16;
	for(int i=0; i<n; i++){
		for(int j=i; j>=0; j--){
			dp[j][i]=min(dp[j][i],(long long)(i-j+1)*a);
			if(j<i) dp[j][i]=min({dp[j][i],dp[j][i-1]+a,dp[j+1][i]+a});
			int cur=prv[j][i],num=2;
			while(cur!=-1){
				dp[cur-(i-j)][i]=min(dp[cur-(i-j)][i],dp[j][i]+b+(long long)num*c+(long long)(i-cur-(num-1)*(i-j+1))*a);
				cur=prv[cur-(i-j)][cur];
				num++;
			}
		}
	}/*
	for(int i=0; i<n; i++) {
		for(int j=i; j<n; j++) cout << dp[i][j] << ' ';
		cout << '\n';
	}*/
	cout << dp[0][n-1];
}
#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...