E. String Reversal (树状数组)

思路:树状数组

考虑每个位置的贡献,从最后一个字符开始计算。

显然对于相同的字符选取靠前的位置的贡献更小。

所以用队列维护相同字母的位置。

从后往前遍历,然后用树状数组维护到当前位置有多少位置没排好,每排好一个位置就更新树状数组,每个位置的贡献就是 q u e r y ( p o s ) − 1 query(pos)-1 query(pos)−1。

此时更新树状数组的正确性是因为:在 p o s pos pos之前的位置整体向右移动一位,然后又因为 p o s pos pos移到他们的前面,抵消了,而 p o s pos pos后的位置,因为前面少一个位置,所以对应的树状数组减1.

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define lx x<<1
#define rx x<<1|1
#define reg register
#define PII pair<int,int>
#define fi first
#define se second
#define pb push_back
#define il inline
#define lowbit(x) x&(-x)
int n,c[N];
char s[N];
queue<int>q[30];
ll ans;
void upd(int x,int v){while(x<=n){c[x]+=v;x+=lowbit(x); }
}
int que(int x){int ans=0;while(x){ans+=c[x],x-=lowbit(x);}return ans;
}
int main(){scanf("%d%s",&n,s+1);for(int i=1;i<=n;i++){q[s[i]-'a'].push(i);upd(i,1);}for(int i=n;i;i--){int p=q[s[i]-'a'].front();q[s[i]-'a'].pop();ans+=que(p)-1;upd(p,-1);}printf("%lld\n",ans);return 0;
}

E. String Reversal (树状数组)相关推荐

  1. VK Cup 2012 Qualification Round 2 C. String Manipulation 1.0 线段树 or 树状数组+二分

    http://codeforces.com/problemset/problem/159/C 题意: 给你一个字符串s,给出一个数k,k倍的s串组成新串str.然后给出n个操作,每个操作对应着pi,c ...

  2. 2017 ACM-ICPC乌鲁木齐网络赛 G. Query on a string(KMP+树状数组)

    题目链接:https://www.jisuanke.com/contest/870 题意: 给出两个字符串S和T,Q次操作:①C a b表示将第a个字符改为b:②Q l r表示T在S的子串[l, r] ...

  3. F2. Promising String (hard version)(cf)树状数组

    原题链接:Problem - F2 - Codeforces 题目大意:给你一个长度为n的字符串,仅包含'+'和'-'字符.两个连续的'-'可以变为'+',问你有多少子串,可以进行任意次数的两个连续的 ...

  4. poj_3067 树状数组

    题目大意 左右两个竖排,左边竖排有N个点,从上到下依次标记为1,2,...N; 右边竖排有M个点,从上到下依次标记为1,2....M.现在从K条直线分别连接左边一个点和右边一个点,求这K条直线的交点个 ...

  5. hdu 1166 敌兵布阵(树状数组)

    题意:区间和 思路:树状数组 #include<iostream> #include<stdio.h> #include<string.h> using names ...

  6. Equalizing Two Strings 冒泡排序or树状数组

    首先考虑排序后相等 如果排序后相等的话就只考虑reverse长度为2的,所以a或者b排序后存在相邻两个字母相等的话就puts YES,n>26也直接puts YES 不然的话就假设c为a,b排完 ...

  7. Hdu 6534 Chika and Friendly Pairs 莫队算法+树状数组

    题目链接 题意求给区间[L,R]中有少对(i,j)满足i<j且abs(a[i]-a[j])<=k. 首先来说暴力的方法就是离散化,然后用树状数组来维护,但是m次询问,m很大,所以说一定会t ...

  8. HDU - 5877 Weak Pair 2016 ACM/ICPC 大连网络赛 J题 dfs+树状数组+离散化

    题目链接 You are given a rootedrooted tree of NN nodes, labeled from 1 to NN. To the iith node a non-neg ...

  9. 树状数组的理解(前缀和 and 差分)

    二更-- 有神仙反映数星星那个题外链炸了,我决定把图给你们粘一下,汉语翻译的话在一本通提高篇的树状数组那一章里有,同时也修改了一些汉语语法的错误 这段时间学了线段树组,当神仙们都在学kmp和hash的 ...

最新文章

  1. 深入浅出CMake(二): 基础语法
  2. python全栈开发 * 表格标签 表单标签 css 引入方式 * 180807
  3. centos7 pe系统安装_老毛桃WinPE以ISO镜像模式安装CentOS7
  4. 最小操作系统的代码解释、NASM的初步使用
  5. PAT甲级1155 Heap Paths (30 分):[C++题解]堆、堆的遍历、树的遍历、dfs输出路径、完全二叉树建树
  6. 的函数原型_JS基础函数、对象和原型、原型链的关系
  7. tf.metrics._将指标标签与MicroProfile Metrics 2.0一起使用
  8. python3 抓取图片
  9. Maximum Subarray leetcode java
  10. 政务大数据的东莞实践 智慧政府建设步伐加快
  11. dv算法java实现_各种排序算法的分析及java实现(二)
  12. jQuery选择器的的优点
  13. python写词法分析器_python实现词法分析器
  14. 浏览器如何知道是哪个html,判断URL请求是从WML浏览器来的还是HTML浏览器来的
  15. 【数理统计】一题了解假设检验
  16. 搜索已配对蓝牙 java,java-查找和配对蓝牙设备
  17. 大学生为何后悔上大学
  18. Shiro安全框架【SpringBoot版】
  19. webinspect导出报告选择项
  20. 软件著作权算法软件设计说明书_软件著作权说明书样本

热门文章

  1. Jetson Nano调试记录:机电设备控制
  2. 学习OpenCV 4(二)滤波与卷积
  3. 优秀的程序员大多是谦虚的
  4. wemos d1 r1点亮st7735s屏幕(Z180SN019)
  5. 纳米技术将为我们带来如普通眼镜般轻薄的VR/AR眼镜
  6. 微信小程序优美界面之纯CSS星球
  7. JAVA 变量的赋值
  8. DBCP 1.X MinIdle ,evict及MinEvictableIdleTimeMillis
  9. Spring5架构,万字文章带你学习
  10. C# ListView用法详解 很完整