Submission #1215741

#TimeUsernameProblemLanguageResultExecution timeMemory
1215741noyancanturkCopy and Paste 3 (JOI22_copypaste3)C++20
100 / 100
2185 ms362760 KiB
#include<bits/stdc++.h>
using namespace std;

#define int int64_t

const int lim=2510;

int n;
string s;
int dp[lim][lim];

int pws[lim],hsh[lim][lim];

const int mod=(1ll<<61)-1;

int sum(int i,int j){
  if(i+j<mod)return i+j;
  return i+j-mod;
}
int sub(int i,int j){
  if(j<=i)return i-j;
  return i-j+mod;
}
int mul(int i,int j){
  return __int128_t(i)*j%mod;
}

unordered_map<int,vector<int>>mp[lim];

signed main(){
  ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
  cin>>n;
  cin>>s;
  int a,b,c;
  cin>>a>>b>>c;
  for(int i=0;i<n;i++){
    for(int j=0;j<n;j++){
      dp[i][j]=LLONG_MAX;
    }
  }
  for(int l=0;l<n;l++){
    hsh[l][l]=s[l];
    for(int r=l+1;r<n;r++){
      hsh[l][r]=sum(s[r],mul(hsh[l][r-1],37));
      mp[r-l][hsh[l][r]].push_back(r);
    }
  }
  for(int l=n-1;0<=l;l--){
    dp[l][l]=a;
    int cc=1;
    for(int r=l+1;r<n;r++){
      if(s[l]==s[r])cc++;
      dp[l][r]=a+b+cc*c + a*(r-l+1-cc);
    }
    for(int r=l+1;r<n;r++){
      dp[l][r]=min(dp[l][r],min(dp[l+1][r],dp[l][r-1])+a);
      int len=r-l+1;
      auto&m=mp[r-l][hsh[l][r]];
      auto p=upper_bound(m.begin(),m.end(),r+len-1);
      int cur=1;
      while(p!=m.end()){
        cur++;
        dp[l][*p]=min(dp[l][*p],dp[l][r]+b+cur*c+(*p-l+1-cur*len)*a);
        p=upper_bound(m.begin(),m.end(),*p+len-1);
      }
    }
  }
  cout<<dp[0][n-1]<<'\n';
}
#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...