Submission #604027

#TimeUsernameProblemLanguageResultExecution timeMemory
604027MohamedAhmed04Boarding Passes (BOI22_passes)C++14
60 / 100
1248 ms4212 KiB
#include <bits/stdc++.h>

using namespace std ;

const int MAX = 1e5 + 10 ;

int arr[MAX] , mark[MAX] ;
int n ;

long double pref[MAX] , suff[MAX] ;

string s ;

vector<int>occ[30] ;

long double dp[MAX] ;
int freq[30] , last[30] ;

int main()
{
	ios_base::sync_with_stdio(0) ;
	cin.tie(0) ;
	cin>>s ;
	n = s.size() ;
	for(int i = 0 ; i < n ; ++i)
		occ[s[i]-'A'].push_back(i) ;
	for(int mask = 1 ; mask < (1 << 10) ; ++mask)
	{
		dp[mask] = 1e18 ;
		for(int c = 0 ; c < 10 ; ++c)
			freq[c] = 0 , last[c] = -1 ;
		long double cnt = 0 ;
		for(int i = 0 ; i < n ; ++i)
		{
			int c = s[i] - 'A' ;
			if((!(mask & (1 << c))))
				continue ;
			pref[i] = (cnt - freq[c]) + 0.5 * freq[c] ;
			if(last[c] != -1)
				pref[i] += pref[last[c]] ;
			++cnt , freq[c]++ , last[c] = i ;
		}
		for(int c = 0 ; c < 10 ; ++c)
			freq[c] = 0 , last[c] = -1 ;
		cnt = 0 ;
		for(int i = n-1 ; i >= 0 ; --i)
		{
			int c = s[i] - 'A' ;
			if((!(mask & (1 << c))))
				continue ;
			suff[i] = (cnt - freq[c]) + 0.5 * freq[c] ;
			if(last[c] != -1)
				suff[i] += suff[last[c]] ;
			++cnt , freq[c]++ , last[c] = i ;
		}
		for(int c = 0 ; c < 10 ; ++c)
		{
			if((!(mask & (1 << c))))
				continue ;
			if(!occ[c].size())
			{
				dp[mask] = min(dp[mask] , dp[mask ^ (1 << c)]) ;
				continue ;
			}
			int sz = occ[c].size() ;
			long double Min = min(pref[occ[c][sz-1]] , suff[occ[c][0]]) ;
			for(int i = 0 ; i < sz-1 ; ++i)
				Min = min(Min , pref[occ[c][i]] + suff[occ[c][i+1]]) ;
			dp[mask] = min(dp[mask] , dp[mask ^ (1 << c)] + Min) ;
		}
	}
	return cout<<fixed<<setprecision(12)<<dp[(1 << 10)-1]<<"\n" , 0 ;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...