#include <bits/stdc++.h>
using namespace std;
#define int long long
signed main(){
	int n, ans=0;
	cin >> n;
	string s;
	cin >> s;
	//cout << s << " " << s[0]-'a' << endl;
	vector<int> a(26,0), c(26,0);
	for(int i=0; i<n; i++){
		a[s[i]-'a']++;
		a[s[n+i]-'a']++;
		c[s[i]-'a']++;
	}
	string ms1="", ms2="", fs1="", fs2="";
	int p=0;
	for(int i=n-1; i>=0; i--){
		if(c[s[i]-'a']>a[s[i]-'a']/2){
			c[s[i]-'a']--;
			ans+=n-i-1-p;
			p++;
			ms1+=s[i];
		}
		else{
			fs1+=s[i];
		}
	}
	p=0;
	for(int i=n; i<n*2; i++){
		if(c[s[i]-'a']<a[s[i]-'a']/2){
			c[s[i]-'a']++;
			ans+=i-n-p;
			p++;
			ms2+=s[i];
		}
		else{
			fs2+=s[i];
		}
	}
	ans+=p*p;
	//cout  << fs1 << " " << fs2 << " " << ms1  << " " << ms2 << endl;
	stack<char> t;
	for(int i=0; i<(long long)fs1.length(); i++){
		t.push(fs1[i]);
	}
	for(int i=0; i<(long long)fs1.length(); i++){
		fs1[i]=t.top();
		t.pop();
	}
	for(int i=0; i<(long long)ms1.length(); i++){
		t.push(ms1[i]);
	}
	for(int i=0; i<(long long)ms1.length(); i++){
		ms1[i]=t.top();
		t.pop();
	}
	fs1=fs1+ms2;
	fs2=ms1+fs2;
	unordered_multiset<char> us;
	for(int i=n-1; i>=0; i--){
		us.insert(fs2[i]);
	}
	for(int i=0; i<n; i++){
		for(char j : us){
			if(j==fs1[i]){
				break;
			}
			ans++;
		}
		us.erase(us.find(fs1[i]));
	}
	cout << ans << endl;
}
| # | 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... |