Submission #548249

#TimeUsernameProblemLanguageResultExecution timeMemory
548249inksamuraiCopy and Paste 3 (JOI22_copypaste3)C++17
100 / 100
718 ms123284 KiB
#include <bits/stdc++.h> using namespace std; #define rep(i,n) for(int i=0;i<n;i++) #define rng(i,x,n) for(int i=x;i<n;i++) #define per(i,n) for(int i=n-1;i>=0;i--) #define fi first #define se second #define pb push_back #define sz(a) (int)a.size() #define vec(...) vector<__VA_ARGS__> #define _3rfKJyA ios::sync_with_stdio(0),cin.tie(0) typedef long long ll; using pii=pair<int,int>; using vi=vector<int>; void print(){cout<<'\n';} template<class h,class...t> void print(const h&v,const t&...u){cout<<v<<' ',print(u...);} // e //snuke's mod int template <ll mod> struct modint{ ll x; // typedef long long ll; modint(ll x=0):x((x%mod+mod)%mod){} modint operator-()const{return modint(-x);} modint& operator+=(const modint a){if((x+=a.x)>=mod) x-=mod; return *this;} modint& operator-=(const modint a){if((x+=mod-a.x)>=mod) x-=mod; return *this;} modint& operator*=(const modint a){(x*=a.x)%=mod; return *this;} modint operator+(const modint a)const{modint res(*this); return res+=a;} modint operator-(const modint a)const{modint res(*this); return res-=a;} modint operator*(const modint a)const{modint res(*this); return res*=a;} modint pow(ll n)const{ modint res=1,x(*this); while(n){ if(n&1)res*=x; x*=x; n>>=1; } return res; } modint inv()const{return pow(mod-2);} }; // include mint here using hshmint=modint<1000000007>; using hshmint1=modint<998244353>; using magicpair=pair<hshmint,hshmint1>; hshmint _p=9973; // base hshmint1 _p1=257; // base1 hshmint pw[3011],invpw[3011]; hshmint1 pw1[3011],invpw1[3011]; magicpair hsh[3011]; struct rollhsh{ rollhsh(string s=""){ init(s); } void init(string s){ // put this out in global if multiple testcases hsh[0]={1,1}; pw[0]=1; pw1[0]=1; invpw[0]=1; invpw1[0]=1; hshmint _invbase=_p.x; hshmint1 _invbase1=_p1.x; _invbase=_invbase.inv(); _invbase1=_invbase1.inv(); rep(i,sz(s)){ pw[i+1]=pw[i]*_p; pw1[i+1]=pw1[i]*_p1; invpw[i+1]=invpw[i]*_invbase; invpw1[i+1]=invpw1[i]*_invbase1; hshmint x=(int)(s[i]-'a'+1); hshmint1 x1=(int)(s[i]-'a'+1); hsh[i+1]={hsh[i].fi+pw[i]*x,hsh[i].se+pw1[i]*x1}; } } pair<ll,ll> get(int l,int r){ // from - to , inclusive hshmint _f=invpw[l]*(hsh[r+1].fi-hsh[l].fi); hshmint1 _s=invpw1[l]*(hsh[r+1].se-hsh[l].se); return {_f.x,_s.x}; } }; signed main(){ _3rfKJyA; int n; cin>>n; string s; cin>>s; ll c0,c1,c2; cin>>c0>>c1>>c2; vec(vi) nxt(n,vi(n,-1)); { using pll=pair<ll,ll>; rollhsh nahsh(s); std::map<pll,int> mp; for(int len=1;len<=n;len++){ mp.clear(); for(int i=n-1;i>=0;i--){ if(i-len+1>=0){ pll p=nahsh.get(i-len+1,i); if(mp.find(p)!=mp.end()){ nxt[i-len+1][i]=mp[p]; } }else{ break; } if(i+len-1<n){ pll p=nahsh.get(i,i+len-1); mp[p]=i; } } } } vec(vec(ll)) f(n,vec(ll)(n,8e18)),g(n,vec(ll)(n)); rng(len,1,n+1){ rep(i,n){ if(i+len-1>=n){ break; } int j=i+len-1; if(len>1){ g[i][j]=min({g[i][j],g[i+1][j],g[i][j-1]}); } f[i][j]=min(f[i][j],1ll*len*c0+g[i][j]); ll cnt=1; int nj=i; while(1){ g[i][nj+len-1]=min(g[i][nj+len-1],-1ll*len*c0*cnt+1ll*cnt*c2+f[i][i+len-1]+c1); nj=nxt[nj][nj+len-1]; if(nj==-1) break; cnt+=1; } } } print(f[0][n-1]); // 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...