#include <bits/stdc++.h>
#define rep(i, x, n) for(int i = x; i <= n; i ++ )
#define downrep(i, x, n) for(int i = n; i >= x; i -- )
#define IO ios::sync_with_stdio(false);cin.tie(0);
template<typename T> void debug(T x) {cout << "#X " << x << endl;}
using namespace std;
typedef long long ll;
const int N = 2e5 + 10;
string s;
int tr[N];
int n;
inline int lowbit(int x) {return x & -x;}
inline ll sum(int x){
ll res = 0;
for(int i = x; i; i -= lowbit(i)) res -= tr[i];
return res;
}
inline void add(int x, int c){
for(int i = x; i <= n; i += lowbit(i)) tr[i] += c;
}
void init()
{
cin >> n >> s;
}
void solve()
{
vector<int> idx(30,0);
vector<int> map[30];
auto org = s;
reverse(s.begin(), s.end());
rep(i,0,s.size() - 1)
map[s[i] - '0'].push_back(i + 1);
ll res = 0;
downrep(i, 0, s.size() - 1)
{
int id = map[org[i] - 'a'].size() - ++idx[org[i] - 'a'];
res += sum(map[org[i] - 'a'][id]);
add(map[org[i] - 'a'][id], 1);
}
cout << res << endl;
}
int main()
{
IO
init();
solve();
}
string adjavant swap problem
最新推荐文章于 2024-09-29 16:46:50 发布
该篇博客探讨了一种字符串处理的方法,通过定义宏实现循环和操作。内容包括使用前缀树(trie)结构进行字符串操作,计算特定字符出现的累计和。问题涉及到字符串的翻转、字符映射以及前缀树的构建与查询,展示了在算法和数据结构中的应用。
摘要由CSDN通过智能技术生成