제출 #634555

#제출 시각아이디문제언어결과실행 시간메모리
634555LittleCubeCopy and Paste 3 (JOI22_copypaste3)C++14
100 / 100
591 ms89804 KiB
#pragma GCC optimize("Ofast,unroll-loops")
#include <bits/stdc++.h>
#define ll long long
#define pii pair<int, int>
#define pll pair<ll, ll>
#define F first
#define S second
using namespace std;

const ll base = 29, mod = 462'779'347'772'851;

int N;
char c[2505];
ll A, B, C, dp[2505][2505], h[2505][2505], nxt[2505][2505];

signed main()
{
	cin >> N;
	for(int i = 1; i <= N; i++)
		cin >> c[i];
	cin >> A >> B >> C;
	for(int i = 1; i <= N; i++)
		for(int j = i; j <= N; j++)
		{
			dp[i][j] = A * (j - i + 1);
			h[i][j] = (h[i][j - 1] * base + c[j] - 'a') % mod;
		}
	for(int l = 1; l <= N; l++)
	{	
		map<ll, int> mp;
		for(int i = N - l + 1; i >= 1; i--)
			if(i + 2 * l - 1 <= N)
			{
				mp[h[i + l][i + 2 * l - 1]] = i + l;
				nxt[i][i + l - 1] = mp[h[i][i + l - 1]];
			    //	cout << "[" << i << ", " << i + l - 1 << "] -> [" << nxt[i][i + l - 1] << "]\n";
			}
	}		

	for(int i = N; i >= 1; i--)
		for(int k = i; k <= N; k++)
		{	
			dp[i][k] = min({dp[i][k], dp[i + 1][k] + A, dp[i][k - 1] + A});
			ll base = dp[i][k] + B, j = nxt[i][k], t = 2;

			for(; j != 0; j = nxt[j][j + k - i])
			{
				dp[i][j + k - i] = min(dp[i][j + k - i], base + t * C + (j + k - i - i + 1 - t * (k - i + 1)) * A);
				t++;
			}
		}

	/* for(int i = 1; i <= N; i++)
		for(int j = 1; j <= N; j++)
			if(j < i) cout << "- ";
			else cout << dp[i][j] << " \n"[N == j];
	*/
	cout << dp[1][N] << '\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...