제출 #1161497

#제출 시각아이디문제언어결과실행 시간메모리
1161497keremEkoeko (COCI21_ekoeko)C++20
110 / 110
6 ms2584 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
#define fr first
#define sc second
#define pb push_back
#define endl "\n"
#define all(x) x.begin(),x.end()
#define sp << " " <<
#define inf 1e10
#define N 100000
 
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
typedef tuple<int,int,int> tiii;
typedef pair<int,int> pii;

int ft[N+5];
void update(int n,int x,int val){
	for(int i=x;i<=n;i+=(i&-i))
		ft[i]+=val;
}
int get(int n,int x){
	int ans=0;
	for(int i=x;i>0;i-=(i&-i))
		ans+=ft[i];
	return ans;
}
int solve(int n,string s){
	memset(ft,0,sizeof(ft));
	int j=n,c=0;
	vector<int> a(26,0);
	for(int i=0;i<2*n;i++){
		if(i<j) a[s[i]-'a']++;
		else a[s[i]-'a']--;
	}
	for(int i=0;i<26;i++)
		if(a[i]<0) c++;
	for(;j<2*n;j++){
		if(!c) break;
		a[s[j]-'a']+=2;
		if(a[s[j]-'a']==0)
			c--;
	}
	j--;
	int ans=0;
	vector<char> str1,str2;
	for(int i=j;i>=0;i--){
		if(a[s[i]-'a']>0){
			a[s[i]-'a']-=2;
			str2.pb(s[i]);
			ans+=j-i;
			j--;
		}
		else
			str1.pb(s[i]);
	}
	reverse(all(str1));
	reverse(all(str2));
	for(int i=n+str2.size();i<2*n;i++)
		str2.pb(s[i]);
	//~ cout << ans << endl;
	//~ for(auto i:str1) cout << i;cout << endl;
	//~ for(auto i:str2) cout << i;cout << endl;
	queue<int> q[26];
	vector<int> v;
	for(int i=0;i<n;i++)
		q[str1[i]-'a'].push(i);
	for(int i=0;i<n;i++){
		int t=q[str2[i]-'a'].front();
		q[str2[i]-'a'].pop();
		ans+=t-i+get(n,n-t);
		update(n,n-t,1);
	}
	return ans;
}     
int32_t main(){
	//~ freopen("a.txt","r",stdin);
	//~ freopen("a.txt","w",stdout);
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);cout.tie(NULL);
	
	int n;
	string s;
	cin >> n >> s;
	int ans=solve(n,s);
	cout << ans << endl;
}
#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...