E. String Reversal (树状数组)
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 (树状数组)相关推荐
- 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 ...
- 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] ...
- F2. Promising String (hard version)(cf)树状数组
原题链接:Problem - F2 - Codeforces 题目大意:给你一个长度为n的字符串,仅包含'+'和'-'字符.两个连续的'-'可以变为'+',问你有多少子串,可以进行任意次数的两个连续的 ...
- poj_3067 树状数组
题目大意 左右两个竖排,左边竖排有N个点,从上到下依次标记为1,2,...N; 右边竖排有M个点,从上到下依次标记为1,2....M.现在从K条直线分别连接左边一个点和右边一个点,求这K条直线的交点个 ...
- hdu 1166 敌兵布阵(树状数组)
题意:区间和 思路:树状数组 #include<iostream> #include<stdio.h> #include<string.h> using names ...
- Equalizing Two Strings 冒泡排序or树状数组
首先考虑排序后相等 如果排序后相等的话就只考虑reverse长度为2的,所以a或者b排序后存在相邻两个字母相等的话就puts YES,n>26也直接puts YES 不然的话就假设c为a,b排完 ...
- Hdu 6534 Chika and Friendly Pairs 莫队算法+树状数组
题目链接 题意求给区间[L,R]中有少对(i,j)满足i<j且abs(a[i]-a[j])<=k. 首先来说暴力的方法就是离散化,然后用树状数组来维护,但是m次询问,m很大,所以说一定会t ...
- 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 ...
- 树状数组的理解(前缀和 and 差分)
二更-- 有神仙反映数星星那个题外链炸了,我决定把图给你们粘一下,汉语翻译的话在一本通提高篇的树状数组那一章里有,同时也修改了一些汉语语法的错误 这段时间学了线段树组,当神仙们都在学kmp和hash的 ...
最新文章
- 深入浅出CMake(二): 基础语法
- python全栈开发 * 表格标签 表单标签 css 引入方式 * 180807
- centos7 pe系统安装_老毛桃WinPE以ISO镜像模式安装CentOS7
- 最小操作系统的代码解释、NASM的初步使用
- PAT甲级1155 Heap Paths (30 分):[C++题解]堆、堆的遍历、树的遍历、dfs输出路径、完全二叉树建树
- 的函数原型_JS基础函数、对象和原型、原型链的关系
- tf.metrics._将指标标签与MicroProfile Metrics 2.0一起使用
- python3 抓取图片
- Maximum Subarray leetcode java
- 政务大数据的东莞实践 智慧政府建设步伐加快
- dv算法java实现_各种排序算法的分析及java实现(二)
- jQuery选择器的的优点
- python写词法分析器_python实现词法分析器
- 浏览器如何知道是哪个html,判断URL请求是从WML浏览器来的还是HTML浏览器来的
- 【数理统计】一题了解假设检验
- 搜索已配对蓝牙 java,java-查找和配对蓝牙设备
- 大学生为何后悔上大学
- Shiro安全框架【SpringBoot版】
- webinspect导出报告选择项
- 软件著作权算法软件设计说明书_软件著作权说明书样本