#include <bits/stdc++.h>
#define int long long
#define pii pair<int, int>
#define ff first
#define ss second
using namespace std;
const int inf = 1e18 + 5;
const int mod = 1e9 + 7;
const int maxm = 5e6 + 1;
const pii bad = {inf, inf};
using ll = long long;
using ld = long double;
int calc(ld x)
{
if(x==0)return 0;
return x*(x-1)/2;
}
void solve()
{
string s;
cin >> s;
int n = s.length();
int g = 0;
vector<int> cs;
vector<int> ord('Z' + 1, -1);
{
vector<int> vis('Z' + 1, 1);
for (char c : s)
{
if (vis[c])
cs.push_back(c),ord[c]=g;
g += vis[c], vis[c] = 0;
}
}
vector<int> v(n);
for (int i = 0; i < n; i++)
v[i] = ord[s[i]];
vector<int> dp((1 << g), inf);
dp[0] = 0;
for (int mask = 1; mask < (1 << g); mask++)
{
int tu = 0;
vector<int> cnt(g, 0), lef(g, 0),viden(g,0),dobri(g,0);
for (int i = 0; i < n; i++)
if ((mask & (1 << v[i])) > 0)
tu++;
{
int r = 0;
for (int i = n-1; i >= 0; i--)
if ((mask & (1 << v[i])) > 0)
cnt[v[i]] += r-dobri[v[i]],r++,dobri[v[i]]++;
}
int l = 0;
for (int i = 0; i < n; i++)
if ((mask & (1 << v[i])) > 0)
{
dp[mask] = min(dp[mask], dp[mask ^ (1 << v[i])] +
calc(viden[v[i]])+calc(dobri[v[i]]-viden[v[i]]) +
2*(lef[v[i]]+cnt[v[i]]));
lef[v[i]]+=l-viden[v[i]];
cnt[v[i]]-=(tu-l)-(dobri[v[i]]-viden[v[i]]);
viden[v[i]]++;
l++;
dp[mask] = min(dp[mask], dp[mask ^ (1 << v[i])] +
calc(viden[v[i]])+calc(dobri[v[i]]-viden[v[i]]) +
2*(lef[v[i]]+cnt[v[i]]));
}
}
cout << dp[(1<<g)-1]/2 << (dp[(1<<g)-1]%2?".5":"") << '\n';
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
solve();
}
# | 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... |