1. 程式人生 > >題解 CF550A 【Two Substrings】

題解 CF550A 【Two Substrings】

為什麼我的做法跟別人如此不一樣啊qwq

思路:暴力判每一個"BA"出現的位置,二分查詢他前/後有沒有滿足條件的"AB",時間複雜度\(O(n\log_{2}n)\)

# include <bits/stdc++.h>

const int MaxN = 100010;

std::vector<int> a, b;//存下標

int upper(int x)//二分後面的位置
{
    int l = 0, r = a.size();
    while(l < r)
    {
        int mid = (l + r) >> 1;
        if(a[mid] > x)
            r = mid;
        else l = mid + 1;
    }
    return l;
}

int lower(int x)//二分前面的位置
{
    int l = -1, r = a.size() - 1;
    while(l < r)
    {
        int mid = (l + r + 1) >> 1;
        if(a[mid] < x)
            l = mid;
        else
            r = mid - 1;
    }
    return l;
}
int main()
{
    std::string s;
    std::cin >> s;
    int len = s.length();
    for(int i = 0; i < len - 1; i++)
    {
        std::string tmp = s.substr(i, 2);
        if(tmp == "AB")
            a.push_back(i);
        else if(tmp == "BA")
            b.push_back(i);
    }//查詢"AB"和"BA"出現的位置
    if(a.size() == 0 || b.size() == 0)
        return 0 * printf("NO");//特判
    for(int i = 0; i < b.size(); i++)
    {
        int x = lower(b[i] - 1);//防重
        int y = upper(b[i] + 1);
        if(x != -1 || y != a.size())
            return 0 * printf("YES");
    }
    printf("NO");
    return 0;
}