제출 #927810

#제출 시각아이디문제언어결과실행 시간메모리
927810andrei_boacaCopy and Paste 3 (JOI22_copypaste3)C++17
100 / 100
667 ms48888 KiB
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
typedef pair<ll,ll> pll;
const ll INF=1e17;
const ll baza=29,baza2=31;
const ll mod=1e9+7,mod2=998244353;
ll h[2505],A,B,C,h2[2505];
ll dp[2505][2505];
ll v[2505];
pll w[2505];
map<pll,ll> nrm;
vector<int> who[2505];
ll n;
string s;
ll nxt[2505];
ll pw[2505],pw2[2505];
pll gethash(ll l,ll r)
{
    ll rez=(h[r]-(h[l-1]*pw[r-l+1])%mod+mod)%mod;
    ll rez2=(h2[r]-(h2[l-1]*pw2[r-l+1])%mod2+mod2)%mod2;
    return {rez,rez2};
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    pw[0]=1;
    pw2[0]=1;
    for(int i=1;i<=2500;i++)
    {
        pw[i]=(pw[i-1]*baza)%mod;
        pw2[i]=(pw2[i-1]*baza2)%mod2;
    }
    cin>>n>>s>>A>>B>>C;
    s=" "+s;
    for(int i=1;i<=n;i++)
    {
        h[i]=(h[i-1]*baza+s[i]-'a'+1)%mod;
        h2[i]=(h2[i-1]*baza2+s[i]-'a'+1)%mod2;
    }
    for(int i=1;i<=n;i++)
        for(int j=i;j<=n;j++)
            dp[i][j]=INF;
    for(int i=1;i<=n;i++)
        dp[i][i]=A;
    for(int lg=1;lg<n;lg++)
    {
        nrm.clear();
        vector<pll> vals;
        for(ll i=1;i+lg-1<=n;i++)
        {
            w[i]=gethash(i,i+lg-1);
            vals.push_back(w[i]);
        }
        sort(vals.begin(),vals.end());
        vals.erase(unique(vals.begin(),vals.end()),vals.end());
        for(int i=0;i<vals.size();i++)
        {
            nrm[vals[i]]=i+1;
            who[i+1].clear();
        }
        for(int i=1;i+lg-1<=n;i++)
        {
            v[i]=nrm[w[i]];
            who[v[i]].push_back(i);
        }
        for(int i=1;i+lg-1<=n;i++)
        {
            nxt[i]=n+1;
            ll st=0;
            ll dr=who[v[i]].size();
            dr--;
            while(st<=dr)
            {
                int mij=(st+dr)/2;
                if(who[v[i]][mij]>i+lg-1)
                {
                    nxt[i]=who[v[i]][mij];
                    dr=mij-1;
                }
                else
                    st=mij+1;
            }
        }
        for(int i=1;i+lg-1<=n;i++)
        {
            ll l=i;
            ll r=i+lg-1;
            if(l>1)
                dp[l-1][r]=min(dp[l-1][r],dp[l][r]+A);
            if(r<n)
                dp[l][r+1]=min(dp[l][r+1],dp[l][r]+A);
            ll val=dp[l][r];
            ll j=i;
            ll cnt=1;
            while(nxt[j]<=n)
            {
                cnt++;
                j=nxt[j];
                r=j+lg-1;
                ll cost=val+B+C*cnt+A*(r-l+1-cnt*lg);
                dp[l][r]=min(dp[l][r],cost);
            }
        }
    }
    cout<<dp[1][n];
    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

copypaste3.cpp: In function 'int main()':
copypaste3.cpp:59:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   59 |         for(int i=0;i<vals.size();i++)
      |                     ~^~~~~~~~~~~~
#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...