CF1234D
CF1234D
链接:
https://codeforces.com/problemset/problem/1234/D
题目大意:
给你一个字符串s,你需要完成如下q次询问
- 把 s 的第 p 位改为 c。输入中表述为 
1 p c - 求 s 从 l 到 r 出现了多少种不同字符。在输入中表述为 
2 l r。 
所有字符都是小写字母并且:
\]
思路:
遇到此类查询与修改问题,首先不能想着去暴力,该题目暴力的复杂度可达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))
随机推荐
- 初学者必读:如何使用 Nuxt  中间件简化网站开发
			
title: 初学者必读:如何使用 Nuxt 中间件简化网站开发 date: 2024/6/24 updated: 2024/6/24 author: cmdragon excerpt: 本文概述了N ...
 - WPF/C#:如何实现拖拉元素
			
前言 在Canvas中放置了一些元素,需要能够拖拉这些元素,在WPF Samples中的DragDropObjects项目中告诉了我们如何实现这种效果. 效果如下所示: 拖拉过程中的效果如下所示: 具 ...
 - Gitlab的安装和使用
			
安装和配置必要的依赖项 yum install dnf sudo dnf install -y curl policycoreutils openssh-server #将SSH服务设置成开机自启动 ...
 - yb课堂 开发前端项目路由 《三十五》
			
Vue-Router开发前端项目路由 vue-router 是Vue.js官方的路由管理器,它和Vue.js的核心深度集成,让构建单页面应用变得易如反掌 官方文档:https://router.vue ...
 - Java 对象转XML xStream 别名的使用 附下载方式
			
下载方式 Maven方式 pom.xml中 <dependency> <groupId>xstream</groupId> <artifactId>xs ...
 - mac 安装jdk1.8 附详细教程
			
详细步骤 下载 链接: https://pan.baidu.com/s/1xQr6_9_7lFNtSes7HsKveA 密码: edme 安装包 一直按继续 配置系统环境变量 上一步骤,实标上,我们只 ...
 - Java-EL表达式替换和简化jsp页面中java代码的编写
			
概念:Expression Language 表达式语言 作用:替换和简化jsp页面中java代码的编写 语法:$ 注意: jsp默认支持el表达式,如果要忽略el表达式 设置jsp中page指令中: ...
 - 10.2 web服务器
			
Web客户端和服务器之间的交互用的是一个基于文本的应用级协议,叫做HTTP(Hypertext Transfer Protocol,超文本传输协议).HTTP是一个简单的协议.一个Web客户端(即浏览 ...
 - 用户数据报协议UDP
			
UDP的首部格式如下: (1) 源端口,源端口号.在需要对方回信时选用.不需要时可用全0. ⑵目的端口,目的端口号.这在终点交付报文时必须使用. ⑶长度,UDP用户数据报的长度,其最小值是8(仅有首部 ...
 - 使用ES6中Class实现手写PromiseA+,完美通过官方872条用例
			
目录 Promise出现的原因 myPromise的实现要点 myPromise的实现 myPromise - 实现简单的同步 myPromise - 增加异步功能 myPromise - 链式调用( ...