F - Substring of Sorted String
题目链接
题解(树状数组)
我们维护两个树状数组,一个记录 \(1\sim i\) 中 \(s_i>s_{i+1}\)的数量,即逆序对数量,另一个记录 \(1\sim i\) 中 \(26\) 个字母的数量。
在修改时很好维护,先把原来的字母数量减 \(1\) ,再新的字母数加 \(1\) ,逆序对以类似方式维护。
重点在查询,一个区间 \([l,r]\) 被包含在排序后的字符串中,当且仅当这个区间里没有逆序对(即统计逆序对数量的树状数组 \([l,r-1]\) ,注意,右端点是 \(r-1\) ,如果右端点是 \(r\) 会统计到 \(s_r > s_{r+1}\) ,不符合我们要求),且除了最头上的字母外中间的字母(大于第一个字母小于最后一个字母)应和所有的字符数量相同(要包含排好序的字符串中连续字符一定要选上,如果 \([l,r]\) 区间的字符串包含了大于第一个字母小于最后一个字母的字母,那么中间的所有字母应包含整个字符串中的字母,也就是说,这个子串中中间的字母应和整个字符串中的字母书相同)。
代码
#include <iostream>
using namespace std;
const int N = 100010;
int n,q;
string s;
int c[N];
int cnt[26][N];
int lowbit (int x) {
return x & -x;
}
void modify (int c[],int x,int d) {
for (int i = x;i <= n;i += lowbit (i)) c[i] += d;
}
int query (int c[],int x) {
int ans = 0;
for (int i = x;i;i -= lowbit (i)) ans += c[i];
return ans;
}
int main () {
cin >> n >> s >> q;
s = ' ' + s;
for (int i = 1;i <= n;i++) modify (cnt[s[i] - 'a'],i,1);
for (int i = 1;i < n;i++) {
if (s[i] > s[i + 1]) modify (c,i,1);
}
while (q--) {
int op;
cin >> op;
if (op == 1) {
int x;
char ch;
cin >> x >> ch;
// if (x + 1 <= n && s[x] > s[x + 1] && ch <= s[x + 1]) modify (c,x,-1);
// else if (x + 1 <= n && s[x] <= s[x + 1] && ch > s[x + 1]) modify (c,x,1);
// if (x - 1 >= 1 && s[x - 1] > s[x] && ch >= s[x - 1]) modify (c,x - 1,-1);
// else if (x - 1 >= 1 && s[x - 1] <= s[x] && ch < s[x - 1]) modify (c,x - 1,1);
modify (cnt[s[x] - 'a'],x,-1),modify (cnt[ch - 'a'],x,1);
if (x - 1 >= 1 && s[x - 1] > s[x]) modify (c,x - 1,-1);
if (x + 1 <= n && s[x] > s[x + 1]) modify (c,x,-1);
s[x] = ch;
if (x - 1 >= 1 && s[x - 1] > s[x]) modify (c,x - 1,1);
if (x + 1 <= n && s[x] > s[x + 1]) modify (c,x,1);
}
else {
int l,r;
cin >> l >> r;
bool ans = true;
for (int i = s[l] - 'a' + 1;i <= s[r] - 'a' - 1;i++) ans &= query (cnt[i],r) - query (cnt[i],l - 1) == query (cnt[i],n);
if (ans && query (c,r - 1) - query (c,l - 1) == 0) puts ("Yes");
else puts ("No");
}
}
return 0;
}
F - Substring of Sorted String的更多相关文章
- 【CodeForces】914 F. Substrings in a String bitset
[题目]F. Substrings in a String [题意]给定小写字母字符串s,支持两种操作:1.修改某个位置的字符,2.给定字符串y,查询区间[l,r]内出现y多少次.|s|,Σ|y|&l ...
- ACM-ICPC 2019南昌网络赛F题 Megumi With String
ACM-ICPC 南昌网络赛F题 Megumi With String 题目描述 给一个长度为\(l\)的字符串\(S\),和关于\(x\)的\(k\)次多项式\(G[x]\).当一个字符串\(str ...
- java用substring函数截取string中一段字符串
在String中有两个substring()函数,如下: 一:String.substring(int start) 参数: start:要截取位置的索引 返回: 从start开始到结束的字符串 例如 ...
- LeetCode第[5]题(Java):Longest Palindromic Substring 标签:String、动态规划
题目中文:求最长回文子串 题目难度:Medium 题目内容: Given a string s, find the longest palindromic substring in s. You ma ...
- LeetCode 1234. Replace the Substring for Balanced String
原题链接在这里:https://leetcode.com/problems/replace-the-substring-for-balanced-string/ 题目: You are given a ...
- 【leetcode】1234. Replace the Substring for Balanced String
题目如下: You are given a string containing only 4 kinds of characters 'Q', 'W', 'E' and 'R'. A string i ...
- 2016多校联合训练4 F - Substring 后缀数组
Description ?? is practicing his program skill, and now he is given a string, he has to calculate th ...
- Codecraft-18 and Codeforces Round #458 (Div. 1 + Div. 2, combined) F. Substrings in a String
http://codeforces.com/contest/914/problem/F 以前做过一个类似的,但是查询的子串长度最多是10,这个时候就是用bit + hash做了.这是因为改变一个字符, ...
- check sub-string in the string
if "blah" not in somestring: continue
- AtCoder Beginner Contest 285 解题报告
AtCoder Beginner Contest 285 解题报告 \(\text{DaiRuiChen007}\) Contest Link A. Edge Checker 2 假设 \(a\ge ...
随机推荐
- WebService 客户端上传图片,服务器端接收图片并保存到本地
需求:如题,C#本地要调用Webservice接口,上传本地的照片到服务器中: 参考:客户端: https://blog.csdn.net/tiegenZ/article/details/799276 ...
- ABAP 范围表 range table
范围表定义: DATA gr_test TYPE RANGE OF char6. 做选择屏幕的时候 范围选择框 默认就是一个范围表 范围表内容: 通过断点调试可以看到,范围表有4列 sign opti ...
- Oracle修改用户密码错误次数及解锁用户
ORACLE11g错误密码登录默认是10次,10次错误后用户将被锁定,如下: SQL> conn test/123456 ERROR: ORA-28000: the account is loc ...
- DDD(二)聚合、聚合根、领域服务、应用服务、仓储”和“工作单元”、领域事件、集成事件
DDD(二)聚合.聚合根.领域服务.应用服务.仓储"和"工作单元".领域事件.集成事件 如果觉得样式不好:跳转即可 http://www.lifengying.site/ ...
- 【IDEA】测试类(test)的模板及定义
人和动物的区别是:能制造和使用工具.因为,工具大大便利了我们的生活. 我们在使用Idea开发java项目的过程中,有些代码是固定的,我们能不能只写几个字,就代表一连串的代码.例如,这里,我们只是输入了 ...
- Yii2安装步骤
通过 Composer 安装了半天一直网络报错,配置了镜像,又报错依赖,运行跳过依赖,这个命令还是报错,我裂开. 最后只能利用归档文件安装,1.下http://www.yiiframework.com ...
- flask、element、vue项目实战:搭建一个加密excel数据的网站
文章目录 一.前端 1.1 上传文件 1.2 数据表格 1.3 加密选项 1.4 加密数据 1.5 下载按钮 二.后端 2.1 .upload 文件上传 2.2 table 数据表格接口 2.3 en ...
- HTTP-看这一篇就够了
HTTP和HTTPS有什么区别 1.传输过程中信息是否加密,HTTP是超文本传输协议,信息是明文传输,HTTPS是具有安全性的SSL加密的超文本传输协议,信息是加密传输: 2.服务端使用的端口号不一致 ...
- java中数组操作,正序,逆序,子数组、自定义排序
// 数组定义,初始化 int[] array = new int[]{1, 2, 2, 1}; int[] dest = new int[10]; Integer[] soul = new Inte ...
- webpack devserver proxy 配置以及react多页面
github地址: https://github.com/yangstar/React-antd-webpack-dev-server var webpack = require('webpack') ...