AtCoder ABC 157E Simple String Queries
题目链接: https://atcoder.jp/contests/abc157/tasks/abc157_e 题目大意 给定一串全由小写英文字母组成的字符串,然后顺序给出$Q$个操作,一种为替换字符串中的某个字符;另一种为查询字符串某个区间里面有多少个不同的字符。要求顺序输出第二种操作的结果。 分析 线段树单点更新,每个节点存一个32位整数,其中26位代表26个英文字母,更新的话只要节点求或就行了。 其他方法1:用26个树状数组,这个原理是一样的,但总感觉没有只用一棵线段树简明。 其他方法2:把每个字母出现的位置存到有序表里面,然后查询的时候利用二分看看字母在不在区间里面,在的话就加一。 以上方法时间复杂度都为$O(QlogN)$,我选用的是一棵线段树的做法。 代码如下 1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 5 /*-------------------Define Start-------------------*/ 6 typedef bool BL; // 布尔类型 7 typedef char SB; // 有符号1字节,8位 8 typedef unsigned char UB; // 无符号1字节,8位 9 typedef