Submission #742201

#TimeUsernameProblemLanguageResultExecution timeMemory
742201SamAndEkoeko (COCI21_ekoeko)C++17
110 / 110
13 ms3428 KiB
#include <bits/stdc++.h>
using namespace std;
#define m_p make_pair
#define all(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())
#define fi first
#define se second
typedef long long ll;
mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
mt19937 rnf(2106);
const int N = 200005;

int n;
char a[N];

int m;
char b[N];

int u[N];

int t[N];
void ubd(int x, int y)
{
    while (x <= n * 2)
    {
        t[x] += y;
        x += (x & (-x));
    }
}

int qry(int x)
{
    int ans = 0;
    while (x)
    {
        ans += t[x];
        x -= (x & (-x));
    }
    return ans;
}

void solv()
{
    cin >> n;
    cin >> (a + 1);

    int q[26] = {};
    for (int i = 1; i <= n * 2; ++i)
    {
        q[a[i] - 'a']++;
    }
    for (int i = 0; i < 26; ++i)
        q[i] /= 2;

    for (int i = 1; i <= n * 2; ++i)
    {
        if (q[a[i] - 'a'])
        {
            b[++m] = a[i];
            --q[a[i] - 'a'];
        }
    }

    for (int i = n + 1; i <= n * 2; ++i)
    {
        b[i] = b[i - n];
    }

    vector<int> v[26];
    for (int i = 1; i <= n * 2; ++i)
    {
        v[b[i] - 'a'].push_back(i);
    }

    for (int i = n * 2; i >= 1; --i)
    {
        u[i] = v[a[i] - 'a'].back();
        v[a[i] - 'a'].pop_back();
    }

    ll ans = 0;
    for (int i = n * 2; i >= 1; --i)
    {
        ans += qry(u[i]);
        ubd(u[i], 1);
    }

    cout << ans << "\n";
}

int main()
{
    #ifdef SOMETHING
    freopen("input.txt", "r", stdin);
    //freopen("output.txt", "w", stdout);
    #endif // SOMETHING
    ios_base::sync_with_stdio(false), cin.tie(0);

    int tt = 1;
    //cin >> tt;
    while (tt--)
    {
        solv();
    }
    return 0;
}
#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...