思路:暴力判每一个”BA”出现的位置,二分查找他前/后有没有满足条件的”AB”,时间复杂度$O(n\log_{2}n)$
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 
 | # 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);
 }
 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;
 }
 
 |