Educational Codeforces Round 105 (Rated for Div. 2)
思路
首先字符串第一个元素一定是’(‘之后剩余的两类会有三种情况:
1:一个‘(’和一个‘)’
2:两个都是‘)’
我们使用这样的方式模拟这三种情况:
a[(s[0]-'A'+1)%3]=-1,a[(s[0]-'A'+2)%3]=1;//一个‘(’和一个‘)’
a[(s[0]-'A'+1)%3]=1,a[(s[0]-'A'+2)%3]=-1;//一个‘(’和一个‘)’
a[(s[0]-'A'+1)%3]=-1,a[(s[0]-'A'+2)%3]=-1//两个都是‘)’
模拟完三种情况以后直接前缀和保证两点:
1.前缀和大于0.
2.最后前缀和为0.
代码
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int a[3];
int main()
{
int t;
cin>>t;
while(t--)
{
memset(a,0,sizeof(a));
string s;
cin>>s;
a[s[0]-'A']=1;
a[(s[0]-'A'+1)%3]=-1,a[(s[0]-'A'+2)%3]=1;
int sum=0,flag=0;
int i;
for(i=0;i<s.size();i++)
{
sum=sum+a[s[i]-'A'];
if(sum<0) break;
}
if(sum==0&&i==s.size()) flag=1;
a[(s[0]-'A'+1)%3]=1,a[(s[0]-'A'+2)%3]=-1,sum=0;
for(i=0;i<s.size();i++)
{
sum=sum+a[s[i]-'A'];
if(sum<0) break;
}
if(sum==0&&i==s.size()) flag=1;
a[(s[0]-'A'+1)%3]=-1,a[(s[0]-'A'+2)%3]=-1,sum=0;
for(i=0;i<s.size();i++)
{
sum=sum+a[s[i]-'A'];
if(sum<0) break;
}
if(sum==0&&i==s.size()) flag=1;
if(flag==1) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}