Submission #742718

#TimeUsernameProblemLanguageResultExecution timeMemory
742718MohamedAhmed04Ekoeko (COCI21_ekoeko)C++14
110 / 110
72 ms6680 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...