#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define int ll
const int N = 2500 + 2;
struct H{
int p,mod;
vector<ll> h,inv;
ll binpow(ll a,ll b) {
ll ret = 1,k = a;
while(b) {
if(b & 1) {
ret *= k;
ret %= mod;
}
k *= k;
k%=mod;
b /= 2;
}
return ret;
}
void init(string s) {
int n = (int)s.size();
h.resize((int)s.size());
inv.resize((int)s.size());
ll x = 1;
for(int i = 0;i < n;i++) {
h[i] = x * 1ll * (s[i] - 'a' + 1)%mod;
if(i) h[i] += h[i - 1];
if(h[i] >= mod) h[i] -= mod;
inv[i] = binpow(x,mod-2);
x = x * 1ll * p%mod;
}
}
int get(int l,int r) {
ll val = h[r];
if(l) {
val -= h[l - 1];
}
if(val < 0) val += mod;
val = val * inv[l]%mod;
return val;
}
}xx,yy;
string s;
ll a,b,c,h[N],p = 167,inv[N];
map<pair<int,int>,ll> mem;
ll solve(int l,int r) {
if(r == l) {
return a;
}
pair<int,int> t = {xx.get(l,r),yy.get(l,r)};
if(mem.count(t)) {
return mem[t];
}
vector<pair<pair<int,int>,array<int,2>>> x;
int mx = (r - l + 1) / 2;
for(int i = l;i <= r;i++) {
for(int j = i;j <= min(r,i+mx-1);j++) {
pair<int,int> T = {xx.get(i,j),yy.get(i,j)};
if(mem.count(T)) continue;
x.push_back({T,{i,j}});
}
}
sort(x.begin(),x.end(),[&](pair<pair<int,int>,array<int,2>> aa,pair<pair<int,int>,array<int,2>>bb){
if(aa.second[1] - aa.second[0]==bb.second[1] - bb.second[0]) {
return aa.first < bb.first;
}
return (aa.second[1] - aa.second[0]) < (bb.second[1] - bb.second[0]);
});
ll res = (r - l + 1) * 1ll * a;
int n = (r - l + 1);
for(int i = 0;i < (int)x.size();) {
int j = i;
while(j < (int)x.size() && x[i].first == x[j].first) {
j++;
}
int mn = -1,col = 0;
for(int k = i;k < j;k++) {
if(x[k].second[0] > mn) {
mn = x[k].second[1];
col++;
}
}
int sz = (x[i].second[1] - x[i].second[0] + 1);
if(col == 1) {
i = j;
continue;
}
assert(sz <= n / 2);
ll val = solve(x[i].second[0],x[i].second[1]) + (n - sz * 1ll * col) * 1ll * a + (col - 1) * c + b + c;
res = min(res,val);
i = j;
}
return mem[t] = res;
}
int n;
void test() {
cin >> n >> s >> a >> b >> c;
yy.p = 37;yy.mod = 998244353;yy.init(s);
xx.p = 167;xx.mod = (int)1e9 + 7;xx.init(s);
// cout << xx.get(1,2) << ' ' << yy.get(1,2) << ' ' << xx.get(4,5) << ' ' << yy.get(4,5) << '\n';
cout << solve(0,n-1);
}
signed main() {
ios_base::sync_with_stdio(false);cin.tie(0);
int t = 1;
// cin >> t;
while(t--) {
test();
}
}
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
348 KB |
Output is correct |
2 |
Correct |
1 ms |
348 KB |
Output is correct |
3 |
Correct |
0 ms |
348 KB |
Output is correct |
4 |
Correct |
0 ms |
348 KB |
Output is correct |
5 |
Correct |
0 ms |
360 KB |
Output is correct |
6 |
Correct |
0 ms |
460 KB |
Output is correct |
7 |
Correct |
0 ms |
344 KB |
Output is correct |
8 |
Correct |
0 ms |
348 KB |
Output is correct |
9 |
Correct |
0 ms |
348 KB |
Output is correct |
10 |
Correct |
0 ms |
348 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
0 ms |
348 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
348 KB |
Output is correct |
2 |
Correct |
1 ms |
348 KB |
Output is correct |
3 |
Correct |
0 ms |
348 KB |
Output is correct |
4 |
Correct |
0 ms |
348 KB |
Output is correct |
5 |
Correct |
0 ms |
360 KB |
Output is correct |
6 |
Correct |
0 ms |
460 KB |
Output is correct |
7 |
Correct |
0 ms |
344 KB |
Output is correct |
8 |
Correct |
0 ms |
348 KB |
Output is correct |
9 |
Correct |
0 ms |
348 KB |
Output is correct |
10 |
Correct |
0 ms |
348 KB |
Output is correct |
11 |
Correct |
1 ms |
348 KB |
Output is correct |
12 |
Incorrect |
0 ms |
348 KB |
Output isn't correct |
13 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
348 KB |
Output is correct |
2 |
Correct |
1 ms |
348 KB |
Output is correct |
3 |
Correct |
0 ms |
348 KB |
Output is correct |
4 |
Correct |
0 ms |
348 KB |
Output is correct |
5 |
Correct |
0 ms |
360 KB |
Output is correct |
6 |
Correct |
0 ms |
460 KB |
Output is correct |
7 |
Correct |
0 ms |
344 KB |
Output is correct |
8 |
Correct |
0 ms |
348 KB |
Output is correct |
9 |
Correct |
0 ms |
348 KB |
Output is correct |
10 |
Correct |
0 ms |
348 KB |
Output is correct |
11 |
Correct |
1 ms |
348 KB |
Output is correct |
12 |
Incorrect |
0 ms |
348 KB |
Output isn't correct |
13 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
348 KB |
Output is correct |
2 |
Correct |
1 ms |
348 KB |
Output is correct |
3 |
Correct |
0 ms |
348 KB |
Output is correct |
4 |
Correct |
0 ms |
348 KB |
Output is correct |
5 |
Correct |
0 ms |
360 KB |
Output is correct |
6 |
Correct |
0 ms |
460 KB |
Output is correct |
7 |
Correct |
0 ms |
344 KB |
Output is correct |
8 |
Correct |
0 ms |
348 KB |
Output is correct |
9 |
Correct |
0 ms |
348 KB |
Output is correct |
10 |
Correct |
0 ms |
348 KB |
Output is correct |
11 |
Correct |
1 ms |
348 KB |
Output is correct |
12 |
Incorrect |
0 ms |
348 KB |
Output isn't correct |
13 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
348 KB |
Output is correct |
2 |
Correct |
1 ms |
348 KB |
Output is correct |
3 |
Correct |
0 ms |
348 KB |
Output is correct |
4 |
Correct |
0 ms |
348 KB |
Output is correct |
5 |
Correct |
0 ms |
360 KB |
Output is correct |
6 |
Correct |
0 ms |
460 KB |
Output is correct |
7 |
Correct |
0 ms |
344 KB |
Output is correct |
8 |
Correct |
0 ms |
348 KB |
Output is correct |
9 |
Correct |
0 ms |
348 KB |
Output is correct |
10 |
Correct |
0 ms |
348 KB |
Output is correct |
11 |
Incorrect |
0 ms |
348 KB |
Output isn't correct |
12 |
Halted |
0 ms |
0 KB |
- |