제출 #714357

#제출 시각아이디문제언어결과실행 시간메모리
714357089487Copy and Paste 3 (JOI22_copypaste3)C++14
62 / 100
3056 ms191336 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){ 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); } } map<pii,bool> vis; rep(L,1,n){ fill(nxt,nxt+n+1,-1); 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...