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 ;
#include <ext/pb_ds/assoc_container.hpp> // Common file
#include <ext/pb_ds/tree_policy.hpp> // Including tree_order_statistics_node_update
using namespace __gnu_pbds;
template<class T> using ordered_set = tree<T, null_type , less<T> , rb_tree_tag , tree_order_statistics_node_update> ;
const int MAX = 2e5 + 10 ;
int arr[MAX] , val[MAX] ;
int n ;
string s ;
int freq[30] , freq2[30] ;
vector<int>occ[30] ;
long long solve(string s1 , string s2)
{
for(int i = n-1 ; i >= 0 ; --i)
occ[s2[i]-'a'].push_back(i) ;
for(int i = 0 ; i < n ; ++i)
val[occ[s1[i]-'a'].back()] = i , occ[s1[i]-'a'].pop_back() ;
ordered_set<int>s ;
long long cnt = 0 ;
for(int i = 0 ; i < n ; ++i)
{
cnt += s.size() - s.order_of_key(val[i]) ;
s.insert(val[i]) ;
}
return cnt ;
}
int main()
{
ios_base::sync_with_stdio(0) ;
cin.tie(0) ;
cin>>n ;
cin>>s ;
for(auto &c : s)
freq[c-'a']++ ;
string s1 = "" , s2 = "" ;
long long ans = 0 , cnt = 0 ;
for(auto &c : s)
{
freq2[c-'a']++ ;
if(freq2[c-'a']*2 <= freq[c-'a'])
s1.push_back(c) , ans += cnt ;
else
s2.push_back(c) , cnt++ ;
}
ans += solve(s1 , s2) ;
return cout<<ans<<"\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... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |