Submission #1217937

#TimeUsernameProblemLanguageResultExecution timeMemory
1217937jerzykCopy and Paste 3 (JOI22_copypaste3)C++20
62 / 100
866 ms54352 KiB
#include <bits/stdc++.h>

using namespace std;
#define st first
#define nd second
#define pb push_back
typedef long long ll;
typedef long double ld;
const ll P = 313LL;
const ll M = 694202137;
const ll I = (1LL<<31LL);
const int N = 2500 + 7;
ll A, B, C;

string s;
ll has[N], pot[N];

int nxt[N][N];
ll dp[N][N];

void Do(int n)
{
    pot[0] = 1LL;
    for(int i = 1; i <= n + 2; ++i)
        pot[i] = (pot[i - 1] * P) % M;
    for(int i = 1; i <= n; ++i)
        has[i] = (has[i - 1] + (ll)(s[i] - 'a') * pot[i]) % M;
}

ll Get(int l, int r, int n)
{
    ll a = has[r] - has[l - 1];
    a += M; a %= M;
    a = (a * pot[n - l]) % M;
    return a;
}

void Calc(int n, int d)
{
    map<ll, int> lst;
    for(int i = n - d + 1; i >= 1; --i)
    {
        if(i + (2 * d) - 1 <= n)
            lst[Get(i + d, i + (2 * d) - 1, n)] = i + d;
        ll a = Get(i, i + d - 1, n);
        if(lst.find(a) == lst.end())
            lst[a] = n + 1;
        nxt[i][d] = lst[a];
    }
}

void Solve()
{
    int n;
    cin >> n;
    cin >> s; s = '#' + s;
    cin >> A >> B >> C;
    for(int i = 1; i <= n; ++i)
        for(int j = i; j <= n; ++j)
            dp[i][j] = (ll)(j - i + 1) * A;
    Do(n);
    for(int i = 1; i < n; ++i)
        Calc(n, i);
    for(int d = 1; d <= n; ++d)
        for(int i = 1; i <= n - d + 1; ++i)
        {
            int j = i + d - 1;
            dp[i][j] = min(dp[i][j], min(dp[i + 1][j], dp[i][j - 1]) + A);
            //cout << i << " " << j << " " << dp[i][j] << " " << nxt[i][d] << "\n";
            if(d == n) continue;
            ll a = dp[i][j] + B + C;
            int p = i;
            while(p <= n)
            {
                dp[i][p + d - 1] = min(dp[i][p + d - 1], a);
                a += C + (ll)(nxt[p][d] - p - d) * A;
                p = nxt[p][d];
            }
        }
    cout << dp[1][n] << "\n";
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    //int t; cin >> t;
    //while(t--)
        Solve();

    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...