Codeforces: TMT Document

题目

学生会有一个共享的文档文件。每天,一些学生会成员都会在其中写下TMT(Towa Maji Tenshi的缩写)序列。

然而,有一天,成员们不知何故同时将序列输入到文档中,造成了混乱。因此,豆岛菅的任务是弄清楚文档是否出现故障。具体来说,他被赋予了一串长度n其字符都是T或M,他想弄清楚是否可以将其划分为一定数量的不相交子序列,所有这些子序列都等于TMT。也就是说,字符串的每个字符应只属于其中一个子序列。

一个字符串一个是字符串的子序列b如果一个可以从以下位置获得b通过删除几个(可能为零个)字符。

输入

第一行包含一个整数t (1 ≤ t ≤ 5000) — 测试用例的数量。

每个测试用例的第一行包含一个整数n (3 ≤ n< 1e5),文档中输入的字符串中的字符数。保证n可被整除3.

每个测试用例的第二行包含一个长度的字符串n仅由字符T和M 组成。

保证总和n在所有测试用例中不超过 1e5.

输出

对于每个测试用例,如果描述的分区存在,则打印包含YES的单行,否则打印包含NO的单行。

样例

输入

5
3
TMT
3
MTT
6
TMTMTT
6
TMTTTT
6
TTMMTT

输出

YES
NO
YES
NO
YES

注意

在第一个测试用例中,字符串本身已经是一个等于TMT 的序列。

在第三个测试用例中,我们可以将字符串划分为子序列TMTMTT。粗体和非粗体子序列都等于TMT。

思路简介 匹配

括号匹配相似, 这次需要匹配是 T 和 M

依旧对字符串进行一位一位的处理

可能出现的情况

1.读取过程中 M 的数量比 T 的数量多 -> NO

2.读取过程中 M 的数量一直不比 T 的数量多,但最终 T 的数量比 2 * M 的数量多 -> NO

3.读取过程中 M 的数量一直不比 T 的数量多,但最终 T 的数量跟 2 * M 的数量一样多 -> YES

  • AC Code
#include <iostream>
#include <string>
using namespace std;

int main ()
{
    int T; cin >> T; 
    while (T--) {
        int n; cin >> n;
        string str; cin >> str;
        int t_nums = 0, m_nums = 0;  // 计数 T, M出现的次数
        int cnt = 0;  // 用来匹配消除的计数器
        for (int i = 0; i < n; i++) {
            if (str[i] == 'M') m_nums ++, cnt ++;  // 当出现 M 时, cnt计数器 + 1
            else {  // 当出现 T 时
                t_nums ++;
                if(cnt) cnt --;  // 判断是否有 M 出现, 如果有, 匹配抵消掉 (可看作是 M 与后方最近的 T 匹配)
            }

            if (m_nums > t_nums) {  // 情况 1 , M 前面的 T 不能把 M 给匹配抵消掉
                cout << "NO\n";
                goto no_next;  // 跟括号匹配同样的道理, 也可以用标志变量 + break
            }
        }

        if (cnt || 2 * m_nums != t_nums) cout << "NO\n";  // 情况 2 , 如果出现 TTM 这种情况(以M结尾, 没能匹配抵消掉 M的 cnt), 或者数量关系不匹配
        else cout << "YES\n";

        no_next: ;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.Zero

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值