Submission #884337

#TimeUsernameProblemLanguageResultExecution timeMemory
884337TAhmed33Boarding Passes (BOI22_passes)C++98
100 / 100
226 ms48584 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long double ld;
typedef long long ll;
string s; int n;
vector <int> pos[26];
ll val[15][15][100001];
ll val2[15][15][100001];
ld dp[(1 << 15)];
int dd[26];
int cnt;
ld f (ll mid, int i, int mask) {
    ld sum = 0;
    for (int j = 0; j < cnt; j++) {
        if (mask & (1 << j)) {
            sum += val[i][j][mid];
            sum += val2[i][j][(int)pos[dd[i]].size() - mid];
        }
    }
    ll x = pos[dd[i]].size();
    sum += 1ll * mid * (mid - 1) * 1.0 / 4 + 1ll * (x - mid) * (x - mid - 1) * 1.0 / 4;
    return sum;
}
ld ans (int mask) {
	ld &ret = dp[mask];
	if (ret == ret) return ret;
	ret = 1e18;
	if (mask == (1 << cnt) - 1) return ret = 0;
	for (int i = 0; i < cnt; i++) {
		if (mask & (1 << i)) continue;
		int m = (int)pos[dd[i]].size();
        ll l = 0, r = m - 1, opt = m;
        while (l <= r) {
            ll mid = (l + r) / 2;
            if (f(mid, i, mask) < f(mid + 1, i, mask)) {
                r = mid - 1; opt = mid;
            } else {
                l = mid + 1;
            }
        }
		ret = min(ret, f(opt, i, mask) + ans(mask ^  (1 << i)));
	}
	return ret;
}
int main () {
	memset(dp, -1, sizeof(dp));
	cin >> s; n = s.length();
	for (int i = 0; i < n; i++) {
		pos[s[i] - 'A'].push_back(i);
	}
	for (int i = 0; i < 26; i++) if (!pos[i].empty()) dd[cnt++] = i;
    for (int i = 0; i < cnt; i++) {
        for (int j = 0; j < cnt; j++) {
            if (i == j) continue;
            int p = 0;
            for (int k = 0; k < (int)pos[dd[i]].size(); k++) {
                while (p < (int)pos[dd[j]].size() && pos[dd[i]][k] > pos[dd[j]][p]) p++;
                val[i][j][k + 1] = p + val[i][j][k];
            }
            p = (int)pos[dd[j]].size() - 1;
            for (int c = 0, k = (int)pos[dd[i]].size() - 1; k >= 0; k--, c++) {
                while (p >= 0 && pos[dd[i]][k] < pos[dd[j]][p]) p--;
                val2[i][j][c + 1] = (int)pos[dd[j]].size() - 1 - p + val2[i][j][c];
            }
        }
    }
	cout << fixed << setprecision(6) << ans(0) << '\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...