Hướng dẫn giải của Upin and Ipin
Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Ta có:
- Trong xâu con ~t~ phải có ít nhất một kí tự U và một kí tự I.
- Để một trong hai người chiến thắng, ~cnt_\texttt{U} \geq 2 \cdot cnt_\texttt{I}~ hoặc ~cnt_\texttt{I} \geq 2 \cdot cnt_\texttt{U}~.
Từ hai điều kiện trên, ta suy ra ~|t| \geq 3~.
Dễ thấy trong một xâu con ~t~ bất kì độ dài ~3~ có chứa cả hai kí tự U và I, ta có ~cnt_\texttt{U} = 1~ và ~cnt_\texttt{I} = 2~ hoặc ~cnt_\texttt{U} = 2~ và ~cnt_\texttt{I} = 1~ (thỏa mãn điều kiện để một trong hai người chiến thắng). Vì vậy, có thể chứng minh rằng nếu tồn tại xâu con ~t~ thỏa mãn yêu cầu, sẽ tồn tại phương án chọn xâu con ~t~ có độ dài bằng ~3~.
Để tìm xâu con ~t~ thỏa mãn yêu cầu, ta duyệt tất cả các xâu con độ dài ~3~ của ~s~ và kiểm tra.
#include <bits/stdc++.h> using namespace std; int main() { int t; cin >> t; for (int test = 1; test <= t; ++test) { string s; cin >> s; int n = s.length(); bool found = false; for (int i = 0; i + 2 < n; ++i) { int sum = 0; for (int j = i; j < i + 3; ++j) { sum += (s[j] == 'U') ? 1 : -1; } if (sum == -1 || sum == 1) { found = true; cout << "Yes " << i + 1 << " " << i + 3 << "\n"; break; } } if (!found) { cout << "No\n"; } } }
Bình luận