Submission #1059782

# Submission time Handle Problem Language Result Execution time Memory
1059782 2024-08-15T08:10:16 Z vjudge1 Copy and Paste 3 (JOI22_copypaste3) C++17
0 / 100
1 ms 512 KB
#include <bits/stdc++.h>

using namespace std;
    
typedef long long 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;
int n;
ll dp[N][N];
int nx[N][N];
map<pair<int,int>,vector<pair<int,int>>> f;
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);
    bool sub = true;
    for(int i = 0;i < n;i++) {
        if(s[i] != 'a') {
            sub = false;
        }
    }
    ll res = n * 1ll * a;
    if(sub) {
        for(int i = 1;i < n;i++) {
            res = min(res,i * 1ll * a + b + a * 1ll * (n % i) + (n / i) * b);
        }
        cout << res;
        return;
    }
    for(int i = 0;i < n;i++) {
        for(int j = i;j < n;j++) {
            f[{xx.get(i,j),yy.get(i,j)}].push_back({i,j});
        }
    }
    for(auto [t,k]:f) {
        int it = (int)k.size() - 1;
        for(int j = (int)k.size() - 1;j >= 0;j--) {
            while(it >= 0 && k[it].first > k[j].second) {
                it--;
            }
            if(it == (int)k.size() - 1) {
                nx[k[j].first][k[j].second] = -1; 
            } else {
                nx[k[j].first][k[j].second] = k[it + 1].first;
            }
        }
    }
    for(int l = n - 1;l >= 0;l--) {
        dp[l][l] = a;
        for(int r = l + 1;r < n;r++) {
            dp[l][r] = min(dp[l + 1][r],dp[l][r - 1]) + a;
            int len = (r - l + 1) / 2;
            int mx = -1;
            for(;len >= 1;len--) {
                if(xx.get(l,l + len - 1) != xx.get(r - len + 1,r)) continue;
                if(yy.get(l,l + len - 1) != yy.get(r - len + 1,r)) continue;
                int occ = 0;
                int L = l,R = l + len - 1;
                while(true) {
                    occ++;
                    L = nx[L][R];
                    R = L + len - 1;
                    if(L == -1 || R > r) {
                        break;
                    }
                }
                if(mx >= occ) break;
                mx = occ;
                int sz = (r - l + 1);
                dp[l][r] = min(dp[l][r],dp[l][l + len - 1] + (sz - len * 1ll * occ) * 1ll * a + (occ - 1) * c + b + c);

            }
            // cout << l << ' ' << r << ' ' << dp[l][r] << '\n';
        }
    }
    cout << dp[0][n-1] << '\n';
}
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 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 344 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 0 ms 512 KB Output is correct
9 Incorrect 0 ms 360 KB Output isn't correct
10 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Incorrect 1 ms 348 KB Output isn't correct
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 344 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 0 ms 512 KB Output is correct
9 Incorrect 0 ms 360 KB Output isn't correct
10 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 344 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 0 ms 512 KB Output is correct
9 Incorrect 0 ms 360 KB Output isn't correct
10 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 344 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 0 ms 512 KB Output is correct
9 Incorrect 0 ms 360 KB Output isn't correct
10 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 344 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 0 ms 512 KB Output is correct
9 Incorrect 0 ms 360 KB Output isn't correct
10 Halted 0 ms 0 KB -