This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#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 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... |