제출 #899062

#제출 시각아이디문제언어결과실행 시간메모리
899062LucaIlieCopy and Paste 3 (JOI22_copypaste3)C++17
100 / 100
937 ms73540 KiB
#include <bits/stdc++.h>

using namespace std;


const int MAX_N = 2500;
int z[2 * MAX_N + 2], nextPos[MAX_N + 1][MAX_N + 1];
long long dp[MAX_N + 1][MAX_N + 1];

int main() {
    int n, a, b, c;
    string s;

    cin >> n >> s >> a >> b >> c;
    s = "#" + s;

    for ( int l = 1; l <= n; l++ ) {
        for ( int r = l; r <= n; r++ )
            dp[l][r] = (long long)a * (r - l + 1) + b;
    }

    string t = s;
    for ( int l = n; l >= 1; l-- ) {
        t = s[l] + t;

        int ls = 0, rs = 0;
        for ( int i = 1; i < t.size(); i++ )
            z[i] = 0;
        for ( int i = 1; i < t.size(); i++ ){
            if ( i < rs )
                z[i] = min( z[i - ls], rs - i );
            while( i + z[i] < t.size() && t[z[i]] == t[i + z[i]] )
                z[i]++;
            if ( i + z[i] > rs ) {
                ls = i;
                rs = i + z[i];
            }
        }

        for ( int r = l; r <= n; r++ ) {
            int i = n - l + r + 2;
            while ( i < t.size() && z[i] < r - l + 1 )
                i++;
            nextPos[l][r] = i - (n - l + 1);
        }
    }

    for ( int len = 1; len <= n; len++ ) {
        for ( int l = 1; l <= n - len + 1; l++ ) {
            int r = l + len - 1;

            dp[l - 1][r] = min( dp[l - 1][r], dp[l][r] + a );
            dp[l][r + 1] = min( dp[l][r + 1], dp[l][r] + a );

            long long cost = dp[l][r] + b + c;
            int k = l;
            while ( nextPos[k][k + len - 1] <= n ) {
                cost += (long long)a * (nextPos[k][k + len - 1] - (k + len)) + c;
                k = nextPos[k][k + len - 1];
                dp[l][k + len - 1] = min( dp[l][k + len - 1], cost );
            }
        }
    }

    cout << dp[1][n] - b << "\n";

    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

copypaste3.cpp: In function 'int main()':
copypaste3.cpp:27:28: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   27 |         for ( int i = 1; i < t.size(); i++ )
      |                          ~~^~~~~~~~~~
copypaste3.cpp:29:28: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   29 |         for ( int i = 1; i < t.size(); i++ ){
      |                          ~~^~~~~~~~~~
copypaste3.cpp:32:29: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   32 |             while( i + z[i] < t.size() && t[z[i]] == t[i + z[i]] )
      |                    ~~~~~~~~~^~~~~~~~~~
copypaste3.cpp:42:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   42 |             while ( i < t.size() && z[i] < r - l + 1 )
      |                     ~~^~~~~~~~~~
#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...