ビ太郎と 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

posted @ 2023-08-13 10:42  _Unnamed  阅读(20)  评论(0)    收藏  举报