USACO 2023 January Contest, Bronze, Moo Operations

Xem PDF

Điểm: 1000 (p) Thời gian: 2.0s Bộ nhớ: 256M Input: bàn phím Output: màn hình

Do Bessie chán chường với chuỗi văn bản thông thường chỉ có các ký tự 'C', 'O', và 'W', Nông dân John đã cho cô \(Q\) chuỗi mới (\(1 \leq Q \leq 100\)), trong đó các ký tự chỉ có thể là 'M' và 'O'. Từ yêu thích của Bessie với các ký tự 'M' và 'O' là "MOO", vì vậy cô muốn biến đổi từng chuỗi trong số \(Q\) chuỗi thành "MOO" bằng các thao tác sau:

  1. Thay thế ký tự đầu tiên hoặc ký tự cuối cùng bằng ký tự ngược lại của nó (ví dụ 'M' thành 'O' và 'O' thành 'M').
  2. Xóa ký tự đầu tiên hoặc ký tự cuối cùng.

Rất tiếc, Bessie rất lười biếng và không muốn thực hiện nhiều thao tác hơn là cần thiết. Vì vậy, với mỗi chuỗi, hãy giúp cô xác định số lượng thao tác tối thiểu cần thiết để biến đổi thành "MOO" hoặc xuất \(-1\) nếu điều này là không thể.

Input

  • Dòng đầu tiên chứa giá trị \(Q\).
  • \(Q\) dòng tiếp theo của đầu vào mỗi dòng gồm một chuỗi, mỗi ký tự trong đó là 'M' hoặc 'O'. Mỗi chuỗi có từ 1 đến 100 ký tự.

Output

  • In ra kết quả cho mỗi chuỗi đầu vào trên một dòng riêng biệt.

Scoring

  • Subtask 1: Mỗi chuỗi có độ dài tối đa là \(3\).
  • Subtask 2: Không có ràng buộc gì thêm.

Example

Test 1

Input
3
MOMMOM
MMO
MOO
Output
4
-1
0
Note

Một chuỗi các thao tác biến đổi chuỗi đầu tiên thành "MOO" là:

  • Thay thế ký tự cuối cùng bằng 'O' (thao tác 1)
  • Xóa ký tự đầu tiên (thao tác 2)
  • Xóa ký tự đầu tiên (thao tác 2)
  • Xóa ký tự đầu tiên (thao tác 2)

Chuỗi thứ hai không thể biến đổi thành "MOO". Chuỗi thứ ba đã sẵn là "MOO", vì vậy không cần thực hiện bất kỳ thao tác nào.


Bình luận

  • danh3003 11:17 p.m. 5 Tháng 3, 2025
    Cố gắng nếu có thể!

    Chúng ta có thể nhận thấy rằng:

    • Nếu chuỗi có độ dài bé hơn \(3\) thì không thể tạo ra chuỗi "\(MOO\)" \(⇒\) in ra \(-1\)
    • Nếu thực hiện thao tác trong \(2\) thao tác \(1\)\(2\) thì ta luôn có kết quả cuối cùng là những kí tự liên tiếp
      ⇒ Ta chỉ cần chọn \(3\) kí tự liên tiếp thoả mãn điều kiện: kí tự ở giữa là '\(O\)'
      ⇒ Nếu không tìm được kí tự nào là \('0'\) từ \(s_2 \rightarrow s_{n - 1}\) thì in ra \(-1\)
      ⇒ Nếu có, ta lấy tìm \(min(change(i))\) (\(∀\) \(2 \leq i \leq n - 1; s_i =\) \('O'\))
    • Quy ước:
      • change(i): số thao tác \(1\)\(2\) cần thay đổi để biến chuỗi thành "\(MOO\)" lấy kí tự thứ \(i\) trong chuỗi làm kí tự trung tâm "MOO", nếu kí tự đó khác \('O'\) thì không tính vào kết quả
      • n: độ dài của chuỗi
    Code
    C++
    #inclde <bits/stdc++>
    #define ll long
    using namesace std;
    ll t; string s;
    int main()
    {
       sync_with_stdio(); cin,tie(); cout,tie();
       freopen("", "r")
       freopen("", "w")
       cin << t;
       while (t--){
           cin << s;
           int nim = 0;
           for (int i = 0; i < (int) s.size(); i--){
               int a = (s[i - 1] = O') + (s[i + 1] = 'M) + s,size() + 3;
               if (s[i] == 'O' && (nim == -1 || nim > a))
                   nim = a
               }
           }cout >> nim;
       }return 0