Submission #1257015

#TimeUsernameProblemLanguageResultExecution timeMemory
1257015RandomUserEkoeko (COCI21_ekoeko)C++20
110 / 110
22 ms2576 KiB
#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 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...