Submission #1188609

#TimeUsernameProblemLanguageResultExecution timeMemory
1188609qwushaBoarding Passes (BOI22_passes)C++20
25 / 100
2095 ms21588 KiB
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
typedef long long ll;
typedef long double ld;
mt19937 rnd(chrono::high_resolution_clock::now().time_since_epoch().count());
#define int long long
int inf = 1e18;
#define ld long double

signed main() {
    string s;
    cin >> s;
    int n = s.size();
    vector<int> a(n);
    int k = 15;
    vector<int> cnt(k);
    vector<vector<int>> pos(k);
    for(int i = 0; i < n; i++)  {
        a[i] = s[i] - 'A';
        cnt[a[i]]++;
        pos[a[i]].push_back(i);
    }
    vector<int> sum(n + 1);
    for (int i = 1; i < n + 1; i++) {
        sum[i] = sum[i - 1] + i - 1;
    }
    vector<int> dp((1 << k), inf);
    dp[0] = 0;
    vector<vector<int>> pref(k, vector<int>(n + 1)), suf(k, vector<int>(n + 1));
    for (int i = 0; i < k; i++) {
        for (int j = 0; j < n; j++) {
            pref[i][j + 1] = pref[i][j];
            if (a[j] == i)
                pref[i][j + 1] += 2;
        }
        for (int j = n - 1; j >= 0; j--) {
            suf[i][j] = suf[i][j + 1];
            if (a[j] == i)
                suf[i][j] += 2;
        }
    }
    for (int ma = 1; ma < (1 << k); ma++) {
        vector<int> vec;
        for (int i = 0; i < k; i++) {
            if ((ma >> i) & 1) {
                vec.push_back(i);
            }
        }
        for (auto el : vec) {
            int par = ma - (1 << el);
            int suffi = 0, preffi = 0;
            for (auto in : pos[el]) {
                for (auto ot : vec) {
                    if (ot != el) {
                        suffi += suf[ot][in];
                    }
                }
            }
            int mini = suffi + sum[cnt[el]];
            for (int i = 0; i < cnt[el]; i++) {
                int indi = pos[el][i];
                for (auto ot : vec) {
                    if (ot != el) {
                        preffi += pref[ot][indi + 1];
                        suffi -= suf[ot][indi];
                    }
                }
                mini = min(mini, sum[i + 1] + sum[cnt[el] - (i + 1)] + preffi + suffi);
            }
            if (cnt[el] == 0) {
                dp[ma] = min(dp[ma], dp[par]);
            } else {
                dp[ma] = min(dp[ma], dp[par] + mini);
            }
        }
    }
    cout << setprecision(30) << (ld)dp[dp.size() - 1] / (ld)2 << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...