[AtCoder ABC314D] LOWER 题解
题意简述
更好的阅读体验
AtCoder 原题面
洛谷原题面
给定长度为
- 如果
t_i = 1 ,则将S 的第x_i 个字符变为c_i 。 - 如果
t_i = 2 ,则将S 中的所有大写字母变成小写字母。 - 如果
t_i = 3 ,则将S 中的所有小写字母变成大写字母。
输出最终的
分析
首先考虑暴力的做法:每次读入,如果
但这样的时间复杂度是
不难发现,如果操作是类似这样的:
2 0 a
1 1 a
1 1 a
.
.
.
3 0 a
那么第一次进行的修改操作,在很多次之后被覆盖。
所以,我们前面进行的很多操作都是无用的。
事实上,最后的字符串
但同时,如果我们直接最后全部更新是有误的。
如果有类似这样的样例:
5
abcde
6
3 0 a
1 1 a
1 2 b
1 3 c
1 4 d
1 5 e
答案应该是 abcde。但如果按照刚才的思路去写,输出的将是 ABCDE。
所以我们就可以发现,最后一次操作
那么,我们记录最后一次操作
每次操作
最后扫一遍字符串,看是否满足
时间复杂度:
空间复杂度:
Code
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 5e5 + 5;
int n, m, x, y;
string s;
int cg[MAXN];
int f = -1, op = -1;
int main(){
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> n >> s >> m;
s = ' ' + s;
for (int i = 1; i <= m; i++){
int a, b;
char p;
cin >> a >> b >> p;
if (a == 1){
s[b] = p;
cg[b] = i;
}else if (a == 2){
f = 0;
op = i;
}else {
f = 1;
op = i;
}
}
for (int i = 1; i <= n; i++){
if (cg[i] <= op){
if (f && 'a' <= s[i] && s[i] <= 'z'){
s[i] += 'A' - 'a';
}else if (f == 0 && 'A' <= s[i] && s[i] <= 'Z'){
s[i] += 'a' - 'A';
}
}
}
cout << s;
return 0;
}