#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |