voidgetnxt(){ std::unordered_map<u64, int> mp; for (int i = n; i; --i) { for (int j = i; j; --j) { u64 hsh = gethash(j, i); if (mp.count(hsh)) nxt[j][i] = mp[hsh]; } for (int j = i; j <= n; ++j) mp[gethash(i, j)] = j; } }
voiddickdreamer(){ std::cin >> n >> str >> A >> B >> C; str = " " + str; prework(), getnxt(); memset(f, 0x3f, sizeof(f)); for (int i = 1; i <= n + 1; ++i) f[i][i - 1] = 0; for (int len = 1; len <= n; ++len) { for (int i = 1; i <= n - len + 1; ++i) { int j = i + len - 1; f[i][j] = std::min({f[i][j], f[i + 1][j] + A, f[i][j - 1] + A}); for (int k = 1, p = j; p; ++k, p = nxt[p - len + 1][p]) { f[i][p] = std::min(f[i][p], f[i][j] + B + C * k + A * (p - i + 1 - k * len)); } } } std::cout << f[1][n] << '\n'; }