제출 #714355

#제출 시각아이디문제언어결과실행 시간메모리
714355089487Copy and Paste 3 (JOI22_copypaste3)C++14
62 / 100
3025 ms152028 KiB
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx,popcnt,sse4,abm")
#include<bits/stdc++.h>
#define int long long
#define quick ios::sync_with_stdio(0);cin.tie(0);
#define rep(x,a,b) for(int x=a;x<=b;x++)
#define repd(x,a,b) for(int x=a;x>=b;x--)
#define lowbit(x) (x&-x)
#define sz(x) (int)(x.size())
#define F first
#define S second
#define all(x) x.begin(),x.end()
#define mp make_pair
#define eb emplace_back
using namespace std;
typedef pair<int,int> pii;
void debug(){
    cout<<"\n";
}
template <class T,class ... U >
void debug(T a, U ... b){
    cout<<a<<" ",debug(b...);
}
const int N=25e2+7;
const int INF=1e18;
const int p=29;
pii operator + (pii a, int b){
	return mp(a.F+b,a.S+b);
}
pii operator + (pii a,pii b){
	return mp(a.F+b.F,a.S+b.S);
}
pii operator % (pii a,pii b){
	return mp(a.F%b.F,a.S%b.S);
}
pii operator - (pii a,pii b){
	return mp(a.F-b.F,a.S-b.S);
}
pii operator * (pii a,int b){
	return mp(a.F*b,a.S*b);
}
pii operator * (pii a,pii b){
	return mp(a.F*b.F,a.S*b.S);
}
const pair<int,int> Mod=mp(1234567891,998244353);
pii pref[N];
pii px[N];
int dp[N][N];
string s;
void build(int n){
	mt19937 rand(time(0));
	px[0]=mp(1,1);
	rep(i,1,n){
		px[i]=px[i-1]*p%Mod;
		pref[i]=pref[i-1]*p%Mod+(s[i-1]-'a'+2);
	}
}
pii q(int l,int r){
	return (pref[r]-pref[l-1]*px[r-l+1]%Mod+Mod)%Mod;
}
int nxt[N];
signed main(){
	quick

	int n;
	cin>>n;
	cin>>s;
	build(n);
	int a,b,c;
	cin>>a>>b>>c;
	map<pii,vector<int> > mx;
	rep(i,1,n){
		rep(j,i,n){
			dp[i][j]=(j-i+1)*a;
			mx[q(i,j)].eb(i);
		}
	}
	rep(L,1,n){
		fill(nxt,nxt+n+1,-1);
		map<pii,bool> vis;
		rep(l,1,n-L+1){
			int r=l+L-1;
			pii qx=q(l,r);
			int n2=sz(mx[qx]);
			if(l<r) dp[l][r]=min({dp[l][r],dp[l][r-1]+a,dp[l+1][r]+a});
			if(!vis[qx]&&n2!=1){
				int _r=0;
				rep(i,0,n2-2){
					while(_r<n2&&mx[qx][_r]<=mx[qx][i]+L-1) _r++;
					nxt[mx[qx][i]]=(_r>=n2 ? -1 : mx[qx][_r]);
				}
				vis[qx]=true;
			}
			int px=nxt[l];
			int pst=1;
			while(px!=-1){
				dp[l][px+L-1]=min(dp[l][px+L-1],(px-l-pst*L)*a+pst*c+b+c+dp[l][r]);
				pst++;
				px=nxt[px];
			}
		}
	}
	cout<<dp[1][n]<<"\n";
	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...