Submission #1163483

#TimeUsernameProblemLanguageResultExecution timeMemory
1163483yhkhooEkoeko (COCI21_ekoeko)C++17
110 / 110
8 ms2116 KiB
#include <bits/stdc++.h> using namespace std; #define lsb(x) ((x) & (-x)) const int MAXN = 100001; int n; int fw[MAXN]; void update(int X, int V){ X++; while(X<=n){ fw[X] += V; X += lsb(X); } } int query(int R){ R++; int res = 0; while(R){ res += fw[R]; R -= lsb(R); } return res; } int main(){ cin.tie(0); ios_base::sync_with_stdio(0); cin >> n; char s[2*n]; cin >> s; int cnt[26]; memset(cnt, 0, sizeof(cnt)); for(int i=0; i<2*n; i++){ cnt[s[i] - 'a']++; } int cna[26]; for(int i=0; i<26; i++){ cna[i] = cnt[i] / 2; } char s1[n], s2[n]; auto s1p = s1, s2p = s2; long long ans = 0; for(int i=0; i<2*n; i++){ if(cna[s[i] - 'a']){ ans += i - (s1p - s1); *s1p = s[i]; s1p++; cna[s[i] - 'a']--; } else{ *s2p = s[i]; s2p++; } } vector<int> locs[26]; for(int i=0; i<n; i++){ locs[s2[i] - 'a'].push_back(i); } int lp[26]; memset(lp, 0, sizeof(lp)); int ts[n]; for(int i=0; i<n; i++){ auto t = s1[i] - 'a'; ts[i] = locs[t][lp[t]]; lp[t]++; } for(int i=1; i<n; i++){ update(i, 1); } for(int i=0; i<n; i++){ ans += query(ts[i]) - i; update(0, 1); update(ts[i], -1); } cout << ans; 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...