제출 #722691

#제출 시각아이디문제언어결과실행 시간메모리
722691HamletPetrosyanBoarding Passes (BOI22_passes)C++17
60 / 100
1212 ms668 KiB
/// -- -- ---- --- -- --
/// 12.04.2023 Wed 20:35
/// -- -- ---- --- -- --

#include <bits/stdc++.h>
using namespace std;
void abandoned_precalc();

#define pll pair<long long, long long>
#define all(a) (a).begin(), (a).end()
#define len(a) ((long long)(a).size())
#define add push_back
#define mkp make_pair
#define ll long long
#define fr first
#define sc second

const long long INF = 1000000000ll * 1000000003ll;
const long long MOD = 1000000007ll;
const int N = 2e5 + 5, G = 10;

string s;
ll ans4 = INF;

ll dp[(1 << G)];
ll asc[N], pref[N], suf[N];
ll cnt[N], sc;

int o(char x){ return x - 'A'; }

void solve(){
	cin >> s;
//	for(ll i = 0; i <= len(s); i++){
//		ans4 = min(ans4, i * (i - 1) + (len(s) - i) * (len(s) - i - 1));
//	}
//	cout << (double)ans4 / 4. << "\n";

	for(int i = 0; i < len(s); i++) asc[o(s[i])]++;
//	for(int i = 0; i <= G; i++) cout << asc[i] << " ";
//	cout << "\n";

	for(int mask = 1; mask < (1 << G); mask++){
		dp[mask] = INF;
		fill(cnt, cnt + G, 0); sc = 0;
		for(int i = len(s) - 1; ~i; i--){
			if(!(mask & (1 << o(s[i])))) continue;
			sc++; cnt[o(s[i])]++;
			suf[o(s[i])] += sc - cnt[o(s[i])];
			pref[o(s[i])] = 0;
		}
		for(int i = 0; i < G; i++){
			if(!(mask & (1 << i))) continue;
			dp[mask] = min(dp[mask], dp[mask ^ (1 << i)]
										+ suf[i] * 4
										+ cnt[i] * (cnt[i] - 1));
		}
		for(int i = 0, pc = 0; i < len(s); i++){
			if(!(mask & (1 << o(s[i])))) continue;
			suf[o(s[i])] -= sc - cnt[o(s[i])];
			sc--; cnt[o(s[i])]--; pc++;
			pref[o(s[i])] += pc - asc[o(s[i])] + cnt[o(s[i])];
			dp[mask] = min(dp[mask], dp[mask ^ (1 << o(s[i]))]
										+ (pref[o(s[i])] + suf[o(s[i])]) * 4
										+ cnt[o(s[i])] * (cnt[o(s[i])] - 1) + (asc[o(s[i])] - cnt[o(s[i])]) * (asc[o(s[i])] - cnt[o(s[i])] - 1));
		}
	}
	cout << (double)dp[(1 << G) - 1] / 4. << "\n";
}

int main(){
	ios_base::sync_with_stdio(false); cin.tie(0);
	int _ = 1;
	cout << fixed;
	cout.precision(9);

	abandoned_precalc();
	// cin >> _ ;
	while(_--) solve();
	return 0;
}

/// ---- - --------  ------ -------- -- - - -
/// just a reminder. ubuntu password is i o i
/// ---- - --------  ------ -------- -- - - -














void abandoned_precalc(){
	
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...