ビ太郎と IOI (Bitaro and IOI) 题解
\(CODE\)
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
string s;
cin >> s;
int idx1 = -1, idx2 = -1; //记录第一个I和第二个I的下标
bool has_o = false; //是否已经出现过一个O
for (int i = 0; i < n; i++) {
if (s[i] == 'I' && idx1 == -1) {
idx1 = i;
} else if (s[i] == 'O' && idx1 != -1 && !has_o) {
has_o = true;
} else if (s[i] == 'I' && idx1 != -1 && has_o && idx2 == -1) {
idx2 = i;
}
if (idx1 != -1 && has_o && idx2 != -1) { //找到了 I O I
cout << "Yes";
return 0;
}
}
cout << "No";
return 0;
}
思路如下:
首先,我们需要找到第一个 I 的位置。如果我们找到了第一个 I,那么就需要寻找第一个 O 标志位。在我们找到第一个 I 和之后的第一个 O 标志位后,将一个名称为 has_o 布尔变量置为 true。从这一点开始,我们只需按原样遍历该字符串即可。
\(CODE\)(片段)
else if (s[i] == 'I' && idx1 != -1 && has_o && idx2 == -1) {
idx2 = i;
}
该代码使用一个名为 idx2 的变量追踪位置标志。如果遇到第一次出现的 I,且我们已经看到了 O 和第一个 I (这意味着 has_o 只能是真的),那么我们就找到了第二个 I。最后,如果我们成功查找了每个所需的字符,并且它们按正确的顺序。输出 Yes 即可,反之输出 No。

浙公网安备 33010602011771号