Submission #567751

#TimeUsernameProblemLanguageResultExecution timeMemory
567751maomao90Copy and Paste 3 (JOI22_copypaste3)C++17
100 / 100
362 ms94556 KiB
#include <bits/stdc++.h> using namespace std; #define REP(i, j, k) for (int i = j; i < k; i++) #define RREP(i, j, k) for (int i = j; i >= k; i--) template <class T> bool mnto(T &a, const T b) {return a > b ? a = b, 1 : 0;} template <class T> bool mxto(T &a, const T b) {return a < b ? a = b, 1 : 0;} typedef long long ll; #define FI first #define SE second typedef pair<int, int> ii; typedef pair<ll, ll> pll; #define ALL(x) x.begin(), x.end() #define SZ(x) (int) x.size() #define pb push_back typedef vector<int> vi; typedef vector<ii> vii; typedef vector<ll> vll; #ifndef DEBUG #define cerr if(0) cerr #endif const int MAXN = 2505; const int INF = 1000000005; const ll LINF = 1000000000000000005; const int MOD[2] = {1000000007, 998244353}; const int X[2] = {29, 31}; int n; string s; int a, b, c; int hsh[2][MAXN][MAXN]; int nxt[MAXN][MAXN]; ll dp[MAXN][MAXN]; unordered_map<ll, int> mp; int main() { #ifndef DEBUG ios::sync_with_stdio(0), cin.tie(0); #endif cin >> n; cin >> s; cin >> a >> b >> c; REP (z, 0, 2) { REP (i, 0, n) { hsh[z][i][0] = 0; REP (j, 1, n + 1 - i) { hsh[z][i][j] = (ll) hsh[z][i][j - 1] * X[z] % MOD[z] + (s[i + j - 1] - 'a' + 1); if (hsh[z][i][j] >= MOD[z]) { hsh[z][i][j] -= MOD[z]; } } } } REP (l, 1, n + 1) { mp.clear(); RREP (i, n - l, 0) { if (i + l <= n - l) { ll x = (ll) hsh[0][i + l][l] * MOD[1] + hsh[1][i + l][l]; mp[x] = i + l; } ll x = (ll) hsh[0][i][l] * MOD[1] + hsh[1][i][l]; if (mp.find(x) == mp.end()) { nxt[l][i] = n; } else { nxt[l][i] = mp[x]; } } } RREP (i, n - 1, 0) { REP (j, i, n) { dp[i][j] = dp[i + 1][j] + a; } REP (l, 1, n - i + 1) { int j = i + l - 1; mnto(dp[i][j], dp[i][j - 1] + a); int u = i; int cnt = 1; while (nxt[l][u] != n) { u = nxt[l][u]; cnt++; int len = u + l - i; ll cost = dp[i][j] + b + (ll) cnt * c + (ll) (len - cnt * l) * a; mnto(dp[i][u + l - 1], cost); } } } /* RREP (i, n - 1, 0) { REP (j, i, n) { dp[i][j] = min(dp[i + 1][j], dp[i][j - 1]) + a; REP (k, i, j) { ll cost = dp[i][k] + b; int len = k - i + 1; REP (l, i, j + 1) { bool pos = 1; if (l + len - 1 <= j) { REP (m, 0, len) { if (s[i + m] != s[l + m]) { pos = 0; break; } } } else { pos = 0; } if (pos) { l += len - 1; cost += c; } else { cost += a; } } mnto(dp[i][j], cost); } cerr << i << ' ' << j << ": " << dp[i][j] << '\n'; } } */ cout << dp[0][n - 1] << '\n'; return 0; }
#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...