CF978B
和atcoder有道题很像 abc394的c题,也是倒着来处理所有的wa
关键点在于倒着处理
从 0 下标开始处理的问题:
当你从 0 下标开始处理时,一旦移除了一个字符,字符串的长度就会减少,并且后续字符的下标会发生改变。这样一来,循环里的下标 i 就不能正确地指向你期望的字符位置,从而造成遗漏或者错误处理。
举个例子,假设字符串是 "xxx",当 i = 0 时,检测到连续的三个 x,移除 s[0] 后,字符串变为 "xx"。此时,循环变量 i 增加到 1,然而原本的 s[1] 现在变成了 s[0],这样就会遗漏对新的 s[0] 的检查。
倒着处理的优势:
倒着处理时,从字符串的末尾开始,即使移除了一个字符,前面字符的下标也不会改变,所以不会出现遗漏检查的情况。
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int main(){
int n;
cin >> n;
string s;
cin >> s;
for(int i = n - 3; i >= 0; i--){
if(s[i] == 'x' && s[i + 1] == 'x' && s[i + 2] == 'x'){
s.erase(i, 1);
}
}
cout << n - s.size() << endl;
return 0;
}

浙公网安备 33010602011771号