Submission #922352

#TimeUsernameProblemLanguageResultExecution timeMemory
922352Shayan86Ekoeko (COCI21_ekoeko)C++14
110 / 110
18 ms5668 KiB
#include <bits/stdc++.h>
using namespace std;

#pragma GCC optimize("O3,unroll-loops")
// #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
// Ofast, O0, O1, O2, O3, unroll-loops, fast-math, trapv

typedef long long ll;
typedef pair<ll, ll> pll;
typedef pair<int, int> pii;

#define Mp          make_pair
#define sep         ' '
#define endl        '\n'
#define F	        first
#define S	        second
#define pb          push_back
#define all(x)      (x).begin(),(x).end()
#define kill(res)	cout << res << '\n', exit(0);
#define set_dec(x)	cout << fixed << setprecision(x);
#define fast_io     ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define file_io     freopen("input.txt", "r", stdin) ; freopen("output.txt", "w", stdout);

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

const ll A = 28;
const ll N = 2e5 + 50;
const ll Mod = 1e9 + 7;

ll n, num[N], ps[N];

string s, t1, t2;
vector<int> idx[A];

int bit[N];

void upd(int x, int y){
    for(; x <= n; x += x & (-x)) bit[x] += y;
}

int get(int x){
    ll out = 0;
    for(; x; x &= x-1) out += bit[x];
    return out;
}

int main(){
    fast_io;

    cin >> n >> s;
    s = "$" + s;

    for(int i = 0; i < A; i++){
        int cnt = 0, c = 0;
        for(int j = 1; j <= 2*n; j++) if(s[j] - 'a' == i) cnt++;
        for(int j = 1; j <= 2*n; j++) if(s[j] - 'a' == i) num[j] = ((++c) <= cnt/2 ? 1 : 2);
    }

    ll sum = 0;
    for(int i = 1; i <= 2*n; i++) ps[i] = ps[i-1] + num[i] - 1;
    for(int i = 1; i <= 2*n; i++) sum += ps[i] * (num[i] == 1);

    t1 = t2 = "$";
    for(int i = 1; i <= 2*n; i++){
        if(num[i] == 1) t1 += s[i];
        else t2 += s[i];
    }

    for(int i = 0; i < A; i++){
        for(int j = n; j > 0; j--) if(t2[j] - 'a' == i) idx[i].pb(j);
    }

    for(int i = 1; i <= n; i++){
        upd(idx[t1[i] - 'a'].back(), 1); sum += idx[t1[i] - 'a'].back() - get(idx[t1[i] - 'a'].back());
        idx[t1[i] - 'a'].pop_back();
    }

    cout << sum;

}
#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...