atcoder_abc_447D惨烈实况
被自己蠢哭了
本人蒟蒻,也许是因为是D题所以想的有点多了,如果放在B题的话说不定就。。。。。
code(没事找事版本,就是我自己调了半天的版本)
void solve() {
string s;cin>>s;
s=" "+s;
deque<int>back_char;
deque<int>cnt_b;
int ans=0;
for(int i=1;i<=(int)s.length();i++){
if(s[i]!='B'&&s[i]!='C'){
back_char.pb(i);
//while(!cnt_b.empty()&&cnt_b.front()<back_char.front())cnt_b.pof();
//这个while本来在这里的
//反面例子:
/*
A B B A C C
正确答案是1,但是你如果把while放在这里的话,第一个A1和B2配对正常
但是第二个A4和B3配对就不对了,A是要在B后面的才对,
但是你如果把while放在这个里面的话,只有碰到A了才会检查
可是后面没有A了,也就是这个不合法的没有被清楚掉,依然留在这里
*/
}
else if(s[i]=='B'&&!back_char.empty()&&i>back_char.front())cnt_b.pb(i);
else{
//如果是放在这里就对了,你的逻辑本来就该是这样的,
//在碰到C的时候,也就是最后面的这个的时候,把不合法的去掉
while(!cnt_b.empty()&&cnt_b.front()<back_char.front())cnt_b.pof();
if(back_char.size()>0&&cnt_b.size()>0){
ans++;
cnt_b.pof();
back_char.pof();
}
}
}
cout<<ans<<endl;
}
几经波折的db之路
样例给的极具迷惑性,第零版在vscode上和atcoder上跑出来的结果不一样,结果是代码中写了未定义的行为,在自己的vscode上能跑出AC闹麻了,我第一版的就是直接过了所有的样例,但是错了,然后又改,然后新加了一个样例,第二版也是过了全部的样例,包括前面新加的样例,但是又WA了,然后后面又加了一个deque,在atcoder上还是WA了,但是就差三个测试点,后来又改了好久,发现是while的位置有问题,改了位置之后就直接AC了
真正的好解法
void solve2() {
string s;
cin >> s;
int num_a = 0; // 记录当前手头有多少个单身的 'A'
int num_ab = 0; // 记录当前手头有多少个拼好的 "AB"
int ans = 0; // 记录拼成的 "ABC"
for (char c : s) {
if (c == 'A') {
num_a++; // 获得一个 A
}
else if (c == 'B') {
if (num_a > 0) { // 前面有 A 才能拼成 AB
num_a--;
num_ab++;
}
}
else if (c == 'C') {
if (num_ab > 0) { // 前面有 AB 才能拼成 ABC
num_ab--;
ans++;
}
}
}
cout << ans << endl;
}

浙公网安备 33010602011771号