Problem - 1234D - Codeforces
给你一个由小写拉丁字母组成的字符串s和对这个字符串的q个查询。
回顾一下,字符串s的子串s[l;r]就是字符串slsl+1...sr。例如,"codeforces "的子串是 "code"、"force"、"f"、"for",但不是 "coder "和 "top"。
有两种类型的查询。
1 pos c (1≤pos≤|s|,c为小写拉丁字母):用c替换 spos (set spos:=c)。
2 l r (1≤l≤r≤|s|):计算子串s[l;r]中不同字符的数量。
输入
输入的第一行包含一个由不超过105个小写拉丁字母组成的字符串s。
输入的第二行包含一个整数q(1≤q≤105)--查询的数量。
接下来的q行包含查询,每行一个。每个查询都是按照问题陈述中描述的格式给出的。保证至少有一个第二种类型的查询。
输出
对于每一个第二种类型的查询,打印出它的答案--在这个查询中所要求的子串中的明显字符数。
例子
inputCopy
abacaba
5
2 1 4
1 4 b
1 5 b
2 4 6
2 1 7
输出拷贝
3
1
2
输入拷贝
dfcbbcfeeedbaea
15
1 6 e
1 4 b
2 6 14
1 7 b
1 12 c
2 6 8
2 1 6
1 7 c
1 2 f
1 10 a
2 7 9
1 10 a
1 14 b
1 1 f
2 1 11
输出拷贝
5
2
5
2
6
题解:
用set存储每个字母的下标
每次要修改时就把当前s[i]的中的下标删去
再把要修改的字母把下标插入
更改此时的s[i] = c
如果要查询,我们直接进性26次二分找存储在当前字母中的下标是在l~r内
注意set.end()并不是存储数的最后一位
#include
#include
#include
#include
#include
#include