CF1234D

链接:

https://codeforces.com/problemset/problem/1234/D

题目大意:

给你一个字符串s,你需要完成如下q次询问

  • s 的第 p 位改为 c。输入中表述为 1 p c
  • slr 出现了多少种不同字符。在输入中表述为 2 l r

所有字符都是小写字母并且:

\[|s| ≤ 10^5,q <= 10^5
\]

思路:

遇到此类查询与修改问题,首先不能想着去暴力,该题目暴力的复杂度可达1e10,是不可观的,我们发现不同字符,最多也就26种,所以对于这种统计不同字符的题目,一种比较好的解题思路是分桶,26个字母26个桶,对每个桶逐一操作;

如何实现这两个操作?,这道题有两种办法,一种是树状数组/线段树,另一种是set+二分(STL大法),下面代码与思路用的是set+二分的方法,

  • 修改操作: 对于每个修改前字符的桶 erase掉的这个位置p,对于修改的字符的桶加入这个位置p

  • 查询操作: 对每个桶的set二分,因为set是单调的支持二分,二分他的lower_bound(l),也就是第一个比l大或者等于的位置,判断这个位置是否超过R,如果没有超过,说明该字符在区间内,可以计数器++

代码:

set<int> pos[26];
void solve(){
string s;
cin >> s;
int n = s.size();
s = " " +s;
for(int i = 1;i<=n;i++){
pos[s[i]-'a'].insert(i);
}
int q;
cin >> q;
while(q--){
int op;
cin >> op;
if(op==2){
int l,r;
cin >> l >> r;
int cnt = 0;
for(int i = 0; i < 26;i++){
auto id = pos[i].lower_bound(l);
if(id==pos[i].end()) continue; if(*id<=r) cnt++;
}
cout <<cnt << endl;
}else{
int idx;
char c;
cin >> idx >> c;
int yb = s[idx];
pos[yb-'a'].erase(idx);
pos[c-'a'].insert(idx);
s[idx] = c;
}
}
}

时间复杂度:

O(m * log(n))

随机推荐

  1. pycharm中运行jupyter notebook

    进入anaconda prompt,进入对应的虚拟环境 输入jupyter notebook,找到路径和token 这两个随便复制一个,注意是包括token也要复制到 然后打开pycharm,并建立一 ...

  2. 数据标注工具 doccano | 命名实体识别(Named Entity Recognition,简称NER)

    目录 安装 数据准备 创建项目 创建抽取式任务 上传 定义标签 构建抽取式任务标签 任务标注 命名实体识别 导出数据 查看数据 命名实体识别(Named Entity Recognition,简称NE ...

  3. setsocket、getsocket 函数详解

    背景 以前用到socket的时候会调用setsocket进行设置,现在整理有关的笔记的时候,重新查阅资料发现有点奇怪,发现大家比较少使用到这个. setsocket/getsocket #includ ...

  4. Oracle自动化编译无效对象

    问题描述:使用存储过程的方式对oracle数据库的无效对象,如视图或者同义词进行定期的编译,让他变成一个有效的对象,加上定时任务可以实现自动化的处理.同时在数据库内部创建一个记录表,用来记录被编译过的 ...

  5. selenium窗口之间的切换

    import time from selenium.webdriver import Edge from selenium.webdriver.common.by import By from sel ...

  6. 3.8折钜惠,瑞芯微RK3568J国产工业评估板“限时折扣”!

  7. SQLServer统计采集数据库相关信息

    在MS Sql Server中可以能过以下的方法查询出磁盘空间的使用情况及各数据库数据文件及日志文件的大小及使用利用率: 1.查询各个磁盘分区的剩余空间:Exec master.dbo.xp_fixe ...

  8. django python 循环一个月的每一天

    from datetime import datetime, timedelta def get_dates_in_month(year, month): start_date = datetime( ...

  9. openEuler 安装 DocekrCE

    就个人而言,openEuler 算是不错的国产化操作系统."一脉传承"自redhat让实际的使用体验非常丝滑.软件源都是国内的,开箱即用,漏洞的补丁发的也挺及时.美中不足的是貌似 ...

  10. mybatis源码配置文件解析之五:解析mappers标签(解析class属性)

    在上篇文章中分析了mybatis解析mapper标签中的resource.url属性的过程,<mybatis源码配置文件解析之五:解析mappers标签(解析XML映射文件)>.通过分析可 ...