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 ...
随机推荐
- [AGC043B] 123 Triangle
个人思路: 首先,经过 \(1\) 轮就没有 \(3\) 了. 先考虑能否递推前 \(i\) 个数的答案,发现不行. 再考虑能否推出 \(i\) 个数的答案的计算公式,也发现不行. 然后就不会了. 正 ...
- 剪裁正方形图片cropper
<!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8& ...
- css初始化、background属性、jquery选择器模糊匹配、canvas
1.css初始化 2.background 3.jquery选择器模糊匹配 4.canvas画多边形 5.通过css设置canvas背景图片 6.js动态生成变量名
- 【ADB命令】安装app
在电脑上安装以下指令 adb install app的文件位置
- DockerCompose
- pytorch学习笔记(8)--搭建简单的神经网络以及Sequential的使用
1.神经网络图 输入图像是3通道的32×32的,先后经过卷积层(5×5的卷积核).最大池化层(2×2的池化核).卷积层(5×5的卷积核).最大池化层(2×2的池化核).卷积层(5×5的卷积核).最大池 ...
- 由浇花工具开始IOT物联网平台之开始前言篇【1】
在2020年时,突然有个想法,就是做个浇花工具,因为平时喜欢养花,有时忘记浇花,有时感觉手动浇花太麻烦,所以做个这个小玩意,是用.NET 开发的WinForm小程序,来控制单片机,带动水泵浇花,还可以 ...
- 杭电oj--1019题C++实现
这道题有两个问题: 首先,是求利用数论的辗转相除法求最大公约数,后再求最小公倍数m*n/gcd(m,n),其中,m*n可能会超过int 数据范围,所以,该语句换成m/gcd(m,n)*n. 然后是如果 ...
- 解决vuex 状态管理mutations报错为:"[vuex] unknown mutation type: VIWE_NAV"
报错截图: 我的解决思路: 1.先检查gettes方向获取与actions提交是否畅通,同时专注检查code是否输错. 2.我查了别人多数是""在vuex中没有mutation,有 ...
- java mybatisplus+springboot服务器跨域问题
项目本地增删改测试正常,上传到 阿里服 页面出现了 跨域报错问题! 解决方案:添加一个过滤器 package com.rl;import org.springframework.stereotyp ...