Submission #1370460

#TimeUsernameProblemLanguageResultExecution timeMemory
1370460pirmyratgCopy and Paste 3 (JOI22_copypaste3)C++20
100 / 100
301 ms176872 KiB
#include "bits/stdc++.h"
using namespace std;
#define mod 998244353
#define ll long long
#define ff first
#define ss second
#define pb push_back
#define maxn 3005
#define INF (ll)1e16

ll n, A, B, C;
string s;
ll lcp[maxn][maxn], nxt[maxn][maxn], dp[maxn][maxn];

void solve(){
	cin>>n;
	cin>>s;
	s='#'+s;
	cin>>A>>B>>C;

	for(ll i=n; i>=1; i--){
		for(ll j=n; j>=1; j--){
			lcp[i][j]=(s[i]==s[j])*(lcp[i+1][j+1]+1);
		}
	}

	for(ll i=1; i<=n; i++){
		for(ll j=1; j<=n; j++){
			nxt[i][j]=n+1;
			dp[i][j]=INF;
		}
	}

	for(ll i=1; i<=n; i++){
		dp[i][i]=A;
		for(ll j=n; j>i; j--){
			ll len=min(lcp[i][j],j-i);
			if(len)nxt[i][len]=j;
			nxt[i][j-i]=min(nxt[i][j-i],nxt[i][j-i+1]);
		}
	}

	for(ll len=1; len<=n; len++){
		for(ll i=1; i+len-1<=n; i++){
			ll j=i+len-1;
			dp[i][j]=min({dp[i][j],dp[i+1][j]+A,dp[i][j-1]+A});
			ll p=nxt[i][len];
			ll cnt=2;
			while(p<=n){
				dp[i][p+len-1]=min(dp[i][p+len-1],dp[i][j]+B+C*cnt+(p+len-1-i+1-len*cnt)*A);
				p=nxt[p][len];
				cnt++;
			}
		}
	}
	cout<<dp[1][n]<<'\n';
}

int main(){
	// freopen("in.txt","w",stdout);
	// freopen("out.txt","r",stdin);
	ios_base::sync_with_stdio(0); cin.tie(0);
	ll t=1;
	// cin>>t;
	while(t--) solve();
	return 0;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...