题目链接

题解(树状数组)

我们维护两个树状数组,一个记录 \(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的更多相关文章

  1. 【CodeForces】914 F. Substrings in a String bitset

    [题目]F. Substrings in a String [题意]给定小写字母字符串s,支持两种操作:1.修改某个位置的字符,2.给定字符串y,查询区间[l,r]内出现y多少次.|s|,Σ|y|&l ...

  2. ACM-ICPC 2019南昌网络赛F题 Megumi With String

    ACM-ICPC 南昌网络赛F题 Megumi With String 题目描述 给一个长度为\(l\)的字符串\(S\),和关于\(x\)的\(k\)次多项式\(G[x]\).当一个字符串\(str ...

  3. java用substring函数截取string中一段字符串

    在String中有两个substring()函数,如下: 一:String.substring(int start) 参数: start:要截取位置的索引 返回: 从start开始到结束的字符串 例如 ...

  4. LeetCode第[5]题(Java):Longest Palindromic Substring 标签:String、动态规划

    题目中文:求最长回文子串 题目难度:Medium 题目内容: Given a string s, find the longest palindromic substring in s. You ma ...

  5. LeetCode 1234. Replace the Substring for Balanced String

    原题链接在这里:https://leetcode.com/problems/replace-the-substring-for-balanced-string/ 题目: You are given a ...

  6. 【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 ...

  7. 2016多校联合训练4 F - Substring 后缀数组

    Description ?? is practicing his program skill, and now he is given a string, he has to calculate th ...

  8. 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做了.这是因为改变一个字符, ...

  9. check sub-string in the string

    if "blah" not in somestring: continue

  10. AtCoder Beginner Contest 285 解题报告

    AtCoder Beginner Contest 285 解题报告 \(\text{DaiRuiChen007}\) Contest Link A. Edge Checker 2 假设 \(a\ge ...

随机推荐

  1. lg8945题解

    考虑一个20分的\(O(n^2)\)做法:枚举答案区间\([l,r]\),那么显然要把尽可能多的1填入\([l,r]\).使用前缀和计算\([l,r]\)中\(0\)的个数,那么填入后的价值可以\(O ...

  2. 第一章MySQL架构

    1.MySQL架构1.1连接管理与安全性 cpu维护缓存区,存储已就绪的线程,线程驻守在一个cpu上,创建销毁不用重新创建线程.1.2优化与执行 MySQL解析查询进行各种优化包括重写查询.决定表的读 ...

  3. 【剑指Offer】【链表】链表中环的入口结点

    题目:给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. A:创建两个指针,一个pFast一个pSlow指向链头,pFast一次走2步,pSlow一次走1步,如果两个指针必相遇 ...

  4. mongodb更改账户密码

    docker部署方式更改 sudo docker exec -it mongodb mongo admin (登录数据库容器) use admin db.auth('admin','shijiehep ...

  5. “Can't open file for writing”或“operation not permitted”的解决办法

    linux使用vi命令修改一个文件内容的时候,发现无法保存,每次写完使用":q!"命令可以正常退出但是使用":wq!"命令保存文件并退出时出现一下信息提示:   ...

  6. Android 系统完整的权限列表

    访问登记属性  android.permission.ACCESS_CHECKIN_PROPERTIES ,读取或写入登记check-in数据库属性表的权限  获取错略位置  android.perm ...

  7. Linux系统安装&VMware安装一

    本次安装使用的VMware版本是15.5pro,镜像文件是centos7_x86 如果你还没有VMware和镜像文件,这里给你提供: https://my.vmware.com/cn/web/vmwa ...

  8. Jmeter添加JSR223对Python的支持

    通过下载:org.python : jython-standalone : 2.7.2 - Maven Central Repository Search jython-standalone-2.7. ...

  9. python+pytesseract识别图片文字

    此文只介绍一下python+pytesseract识别一些简单图片的数字,字母和汉字.如图1 import pytesseract from PIL import Image,ImageEnhance ...

  10. adaptsegnet 论文分析比较好的

    https://blog.csdn.net/weixin_43795588/article/details/118058775 常用的语义分割一般是由两部分组成:一部分是特征提取器,比如可以用Resn ...