这个题确实是分类讨论,分类讨论后
以下代码在洛谷一个点也过不了,蓝桥杯可以过7/11个点,C语言网莫名其妙超时
分类讨论哪里出错了QWQ
#include <bits/stdc++.h>
using std::cin;
using std::cout;
typedef long long ll;
int Solve(int o_ow, int wo_o, int o_o, int wo_ow, int o_, int _o, int wo_, int _ow, int w) {
int c1 = 0, c2 = 0, c3 = 0, c4 = 0, c5 = 0, ans = 0, z = 0;
if (o_ow > 0) {
c1 += 1;
ans += o_ow;
o_ow = 0;
}
if (wo_o > 0) {
c2 += 1;
ans += wo_o;
wo_o = 0;
}
if (o_o > 0 || wo_ow > 0) {
c1 = c2 = 0;
}
if (o_o > 0 && wo_ow > 0) {
c3 = 1;
z = std::min(o_o, wo_ow);
ans += z * 2;
o_o -= z;
wo_ow -= z;
if (o_o > 0 || wo_ow > 0) {
c3 = 0;
}
}
if (o_o > 0 && o_o <= w) {
c4 = 1;
}
if (_ow > 0 || o_ > 0) {
c1 = 0;
}
if (_o > 0 || wo_ > 0) {
c2 = 0;
}
if (_ow > 0 || o_ > 0 || wo_ > 0 || _o > 0) {
c3 = c4 = 0;
}
if (o_o > 0) {
_o += o_o;
o_ += o_o;
}
if (wo_ow > 0) {
_ow += wo_ow;
wo_ += wo_ow;
}
o_o = wo_ow = 0;
z = std::min(_o, wo_);
_o -= z;
wo_ -= z;
ans += z;
z = std::min(_ow, o_);
_ow -= z;
o_ -= z;
ans += z;
z = std::min({_o, o_, w});
ans += z;
return ans - c1 - c2 - c3 - c4 - c5;
}
int Check(std::string str) {
int cnt = 0;
for (int i = 0; i < (ll) str.length() - 2; ++i) {
if (str[i] == 'o' && str[i + 1] == 'w' && str[i + 2] == 'o') {
++cnt;
}
}
return cnt;
}
int main() {
std::ios::sync_with_stdio(false);
//freopen("01.in", "r", stdin);
int o_ow = 0, wo_o = 0, o_o = 0, wo_ow = 0, o_ = 0, _o = 0, wo_ = 0, _ow = 0, w = 0;
int n, base_ans = 0;
cin >> n;
std::string str_tot = "0";
for (int i = 0; i < n; ++i) {
std::string str;
cin >> str;
str_tot += str;
base_ans += Check(str);
int len = str.length();
if (len == 1) {
if (str[0] == 'w') {
w += 1;
} else if (str[0] == 'o') {
o_o += 1;
}
} else if (str[0] == 'o') {
if (str[len - 1] == 'o') {
o_o += 1;
} else if (str[len - 2] == 'o' && str[len - 1] == 'w') {
o_ow += 1;
} else {
o_ += 1;
}
} else if (str[0] == 'w') {
if (str[1] == 'o' && str[len - 1] == 'o') {
wo_o += 1;
} else if (str[1] == 'o' && str[len - 2] == 'o' && str[len - 1] == 'w') {
wo_ow += 1;
} else if (str[1] == 'o') {
wo_ += 1;
}
} else if (str[len - 1] == 'o') {
_o += 1;
} else if (str[len - 2] == 'o' && str[len - 1] == 'w') {
_ow += 1;
}
cout << Solve(o_ow, wo_o, o_o, wo_ow, o_, _o, wo_, _ow, w) + base_ans << "\n";
}
return 0;
}