Submission #622921

#TimeUsernameProblemLanguageResultExecution timeMemory
622921CSQ31Copy and Paste 3 (JOI22_copypaste3)C++17
100 / 100
557 ms73844 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
const ll INF = 1e18;
ll dp[2500][2500];
int nxt[2500][2500];
int main()
{
	ios_base::sync_with_stdio(0);cin.tie(0);
	int n;
	string s;
	ll a,b,c;
	cin>>n>>s>>a>>b>>c;
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			dp[i][j] = INF;
			nxt[i][j] = n;
		}
	}
	for(int i=0;i<n;i++){
		vector<int>z(n,0);
		vector<bool>hav(n,0);
		string t = s.substr(i,n-i);
		int cur = 1;
		int l = 0,r = 0;
		//cout<<"at"<<" "<<i<<'\n';
		for(int j=1;j<n-i;j++){
			if(j<=r)z[j] = min(r-j+1,z[j-l]);
			while(j+z[j]<n-i && t[j+z[j]] == t[z[j]])z[j]++;
			if(j+z[j]-1>r){
				l = j;
				r = j+z[j]-1;
			}
			while(cur<=j && cur<=z[j]){
				//cout<<i<<" "<<i+cur-1<<" "<<i+j<<'\n';
				nxt[i][i+cur-1] = i+j;
				cur++;
			}
		}
		/*
		for(int j=0;j<n;j++)cout<<z[j]<<" ";
		cout<<'\n';
		for(int j=i;j<n;j++)cout<<nxt[i][j]<<" ";
		cout<<'\n';
		* */
		
	}
	for(int i=0;i<n;i++)dp[i][i] = a+b;
	for(int len=0;len<n;len++){
		for(int i=0;i+len<n;i++){
			int r = i+len;
			if(dp[i][r] == INF)continue;
			//cout<<i<<" "<<r<<" "<<dp[i][r]<<'\n';
			if(r+1<n)dp[i][r+1] = min(dp[i][r] + a,dp[i][r+1]);
			if(i)dp[i-1][r] = min(dp[i][r]+a,dp[i-1][r]);
			ll cur = c;
			int pos = i;
			while(pos<n){
				int jump = nxt[pos][pos+len];
				if(jump>=n)break;
				cur+=(jump-(pos+len)-1)*1LL*a;
				cur+=c;
				dp[i][jump+len] = min(dp[i][jump+len],dp[i][r] + cur+b);
				pos = jump;
			}
		}
	}
	cout<<dp[0][n-1] - b<<'\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...