제출 #1332393

#제출 시각아이디문제언어결과실행 시간메모리
1332393chikien2009Copy and Paste 3 (JOI22_copypaste3)C++20
25 / 100
48 ms63388 KiB
#include <bits/stdc++.h>

using namespace std;

void setup()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
}

int n;
int kmp[2500];
string s;
long long a, b, c, d, e, num, last;
long long f[200][200][200], g[200][200];

int main()
{
    setup();

    cin >> n >> s >> a >> b >> c;
    for (int i = 0; i < n; ++i)
    {
        for (int j = i; j < n; ++j)
        {
            fill_n(f[i][j], 200, -1);
        }
    }
    for (int i = 0; i < n; ++i)
    {
        for (int j = i; j < n; ++j)
        {
            for (int k = i + 1; k < n; ++k)
            {
                kmp[k - i] = kmp[k - i - 1] * (k != j + 1);
                while (kmp[k - i] > j - i || (kmp[k - i] > 0 && s[i + kmp[k - i]] != s[k]))
                {
                    kmp[k - i] = kmp[kmp[k - i] - 1];
                }  
                kmp[k - i] += (s[k] == s[i + kmp[k - i]]);
            }
            num = 1;
            last = j;
            for (int k = j + 1; k < n; ++k)
            {
                if (kmp[k - i] == j - i + 1 && last + j - i + 1 <= k)
                {
                    last = k;
                    num++;
                }
                d = k - i + 1 - num * (j - i + 1);
                f[i][k][j] = a * d + num * c + b;
            }
        }
    }
    for (int i = 0; i < n; ++i)
    {
        for (int l = 0, r = i; r < n; ++l, ++r)
        {
            g[l][r] = a * (r - l + 1);
            for (int k = 0; k < n; ++k)
            {
                if (f[l][r][k] != -1)
                {
                    g[l][r] = min(g[l][r], g[l][k] + f[l][r][k]);
                }
            }
            if (l < r)
            {
                g[l][r] = min(g[l][r], min(g[l][r - 1], g[l + 1][r]) + a);
            }
        }
    }
    cout << g[0][n - 1];
    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...