B. TMT Document
Example
input
5
3
TMT
3
MTT
6
TMTMTT
6
TMTTTT
6
TTMMTT
output
YES
NO
YES
NO
YES
题目大意:
一个只有T和M的字符串中,判断能否将它在 相对位置不变的情况,拆成几个TMT子串。
思路:
最后T的数量肯定是M的两倍,所以不是两倍的可以排除掉。每一个M的左右都需要一个T与之配对,因此先从左边遍历,累计T和M的数量,一旦M的数量大于T,肯定不能满足条件,然后再从右边遍历一次就好了。
代码:
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<string>
#include<cmath>
#define AC 0
#define endl '\n'
#define PI acos(-1)
#define Please return
#define int long long
using namespace std;
signed main()
{
fastio();
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
string a;
cin>>a;
int numt=0,numt2=0;
int numm=0,numm2=0;
bool check=false;
for(int i=0,j=n-1;i<n;++i,--j)
{
if(a[i]=='T')++numt;
else ++numm;
if(numm>numt)
{
check=true;
break;
}
if(a[j]=='T')++numt2;
else ++numm2;
if(numm2>numt2)
{
check=true;
break;
}
}
if(check||numt!=2*(n-numt))cout<<"NO"<<endl;
else cout<<"YES"<<endl;
}
Please AC;
}
通过模拟题意发现解决问题的方法,观察所有不满足的情况(比如M…左边没有T,数量对不上),所有刚好满足的情况(比如…MMMTTT,右边的T不能动)