#include <bits/stdc++.h>
#define ar array
//#define int long long
using namespace std;
using ll = long long;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
const int mod = 1e9 + 7;
const ll inf = 1e18;
const int N = 1e5 + 5;
struct fenwick {
int n;
vector<int> tree;
fenwick(int _n) : n(_n+10), tree(n+50) {}
void update(int p, int v) {
for(p++; p<n; p+=p&-p) tree[p] += v;
}
int query(int p) {
int ans = 0;
for(p++; p; p-=p&-p) ans += tree[p];
return ans;
}
};
signed main() {
int n; cin >> n;
string s; cin >> s;
map<char, int> mp;
string l="",r="";
for(char ch : s) mp[ch]++;
ll ans = 0, skip = 0;
for(int i=0; i<2*n; i++) {
if(mp[s[i]]) {
l += s[i];
ans += skip;
mp[s[i]] -= 2;
} else {
r += s[i];
skip++;
}
}
map<int, vector<int> > L, R;
for(int i=0; i<n; i++) {
L[l[i]].push_back(i);
R[r[i]].push_back(i);
}
vector<int> perm(n);
for(char ch='a'; ch<='z'; ch++)
for(int i=0; i<R[ch].size(); i++)
perm[R[ch][i]] = L[ch][i];
fenwick fwt(n);
for(int i=0; i<n; i++) {
ans += i - fwt.query(perm[i]);
fwt.update(perm[i], 1);
}
cout << ans << '\n';
}
# | 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... |