Editorial for Upin and Ipin
Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.
Submitting an official solution before solving the problem yourself is a bannable offence.
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"; } } }
Comments