Submission #716132

#TimeUsernameProblemLanguageResultExecution timeMemory
716132Darren0724Copy and Paste 3 (JOI22_copypaste3)C++17
100 / 100
815 ms98788 KiB
#pragma GCC optimize("Ofast","O3","unroll-loops")
#pragma GCC target("avx2")
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define all(x) x.begin(),x.end()
#define x first
#define y second
#define endl '\n'
const int K=29,INF=1e18,mod=123456789098761;
signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int n;cin>>n;
    vector<char> v(n+1);
    for(int i=1;i<=n;i++){
        cin>>v[i];
    }
    int A,B,C;cin>>A>>B>>C;
    vector<vector<int>> h(n+2,vector<int>(n+2));
    for(int i=1;i<=n;i++){
        for(int j=i;j<=n;j++){
            h[i][j]=h[i][j-1]*K+v[j]-'a'+1;
            h[i][j]%=mod;
        }
    }
    vector<vector<int>> dp(n+2,vector<int>(n+2,INF));
    for(int i=1;i<=n;i++){
        dp[i][i]=A;
    }
    for(int i=1;i<=n;i++){
        map<int,int> mp;
        vector<int> jump(n+1);
        for(int j=1;j+i-1<=n;j++){
            int k=j+i-1;
            dp[j][k]=min({dp[j+1][k]+A,dp[j][k-1]+A,dp[j][k]});
            int cnt=2;
            if(j>i){
                mp[h[j-i][j-1]]=j-i;
            }
            jump[j]=mp[h[j][k]];
            int j1=jump[j];
            while(j1!=0){
                dp[j1][k]=min(dp[j1][k],dp[j][k]+B+cnt*C+(k-j1+1-cnt*i)*A);
                cnt++;
                j1=jump[j1];
            }
        }
    }
    cout<<dp[1][n]<<endl;
    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...