反转字符串

/* abddea aeddba 先预处理队列,a['c'],表示c所有出现的位置,用一个pop一次。 找到了右边最近的出现位置k,则看k前面还剩几个元素,剩几个元素答案加几, 在把k位置删除。 */ #include <bits/stdc++.h> #define CLOSE ios::sync_with_stdio(false);cin.tie(0);cout.tie(0) #define endl "\n" typedef long long LL; const int N = 2e5 + 10, M = N, mod = 1e9 + 7; using namespace std; int t[N], n; char a[N], b[N]; int lowbit(int x) {return x & -x;} void add(int x, int c){ for(int i = x; i <= n; i += lowbit(i)){ t[i] += c; } } LL query(int x){ LL sum = 0; for(int i = x; i; i -= lowbit(i)){ sum += t[i]; } return sum; } queue<int> q[26]; int main() { CLOSE; cin >> n >> (a + 1); for(int i = 1, j = n; i <= n; i ++, j --){ q[a[i] - 'a'].push(i); b[j] = a[i];//存反转的字符串 add(i, 1);//该位置表示未被删除 } int cnt = 0; for(int i = 1; i <= n; i ++){ int k = q[b[i] - 'a'].front();//右边最近的位置 q[b[i] - 'a'].pop(); cnt += query(k - 1);//前面还剩几个元素,则移动几次 add(k, -1);//删除这个元素 } cout << cnt; return 0; }

__EOF__

本文作者可爱的卤蛋
本文链接https://www.cnblogs.com/acwhr/p/18003111.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   可爱的卤蛋  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示