Submission #1010369

#TimeUsernameProblemLanguageResultExecution timeMemory
101036912345678Boarding Passes (BOI22_passes)C++17
100 / 100
308 ms179640 KiB
#include <bits/stdc++.h>

using namespace std;

#define ll long long

const int nx=1e5+5, kx=15;

ll n, p[kx][kx][nx], dp[(1<<kx)+5];
string s;
vector<ll> d[kx];

int main()
{
    cin.tie(NULL)->sync_with_stdio(false);
    cin>>s;
    n=s.size();
    s=' '+s;
    for (int i=0; i<kx; i++) d[i].push_back(0);
    for (int i=1; i<=n; i++) d[s[i]-'A'].push_back(i);
    for (int i=0; i<kx; i++)
    {
        for (int j=0; j<kx; j++)
        {
            ll v=(i==j)?1:2, tmp=0, cnt=0;
            vector<ll> pref(n+2), suf(n+2);
            for (int k=1; k<=n; k++)
            {
                if (s[k]-'A'==i) cnt+=tmp;
                if (s[k]-'A'==j) tmp+=v;
                pref[k]=cnt;
            }
            tmp=cnt=0;
            for (int k=n; k>=1; k--)
            {
                if (s[k]-'A'==i) cnt+=tmp;
                if (s[k]-'A'==j) tmp+=v;
                suf[k]=cnt;
            }
            for (int k=0; k<=n; k++) p[i][j][k]=pref[k]+suf[k+1];
        }
    }
    for (int i=1; i<(1<<kx); i++)
    {
        dp[i]=LLONG_MAX;
        for (int j=0; j<kx; j++)
        {
            if (i&(1<<j))
            {
                ll l=0, r=d[j].size()-1;
                while (l<r)
                {
                    ll md=(l+r)/2, df=0;
                    for (int k=0; k<kx; k++) if (i&(1<<k)) df+=p[j][k][d[j][md+1]]-p[j][k][d[j][md]];
                    if (df>=0) r=md;
                    else l=md+1;
                }
                //cout<<"here "<<d[j][l]<<'\n';
                ll vl=0;
                for (int k=0; k<kx; k++) if (i&(1<<k)) vl+=p[j][k][d[j][l]];
                dp[i]=min(dp[i], dp[i^(1<<j)]+vl);
            }
        }
        //cout<<"dp "<<i<<' '<<dp[i]<<'\n';
    }
    printf("%.4f\n", dp[((1<<kx)-1)]/2.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...