第一次切入的时候切准了就没事,但是,写的时候有个很难发现的错误找了好久,纪念一下。
这个题目的烦人之处是我们喜欢先入为主,
他的第一个条件是b数组为合法的括号序列,第二个条件是a序列的不同位置如果字母相同,那么b序列对应的位置应为相同的括号,那么,我们的想法往往是以第一个条件为主,对a序列搞模拟,在模拟中利用b序列来进行判断,结果是一个泥潭,不容写出来完善的东西,但是,如果先考虑第二个条件,在利用第一个条件来判断,结果就是显然了。
#include <bits/stdc++.h>
//#define int long long
#define ioss ios::sync_with_stdio(0), cin.tie(0)
using namespace std;
template <class cl>
void read(cl &x)
{
x = 0;
int f = 0;
char ch;
ch = getchar();
while (!isdigit(ch))
{
f = f | (ch == '-'), ch = getchar();
}
while (isdigit(ch))
{
x = (x << 1) + (x << 3) + (ch ^ 48);
ch = getchar();
}
x = f ? -x : x;
return;
}
template <class cl>
void put(cl x)
{
if (x < 0)
putchar('-'), x = -x;
if (x > 9)
put(x / 10);
putchar(x % 10 + '0');
return;
}
//int n,k;int ans;
char ch[100];
pair<int,char>m[3];
/*
inline void to()
{
scanf("%s", ch + 1);
m[0].first=m[1].first=m[2].first=0;
m[0].second=m[1].second=m[2].second=' ';
int n=strlen(ch+1);
for(int i=1;i<=n;i++)
{
m[ch[i]-'A'].first++;
m[ch[i]-'A'].second=ch[i];
}
sort(m,m+3);
if(m[2].first!=m[1].first+m[0].first)
{
puts("no");
}
else
{
int tt=0;
for(int i=0;i<=2;i++)
{
if(ch[1]==m[i].second)
{
if(i==2)
{
for(int i=1;i<=n;i++)
{
if(ch[i]==m[2].second)
{
tt++;
}
else
{
tt--;
if(tt<0)
{
puts("no");
return ;
}
}
}
}
else
{
for(int i=1;i<=n;i++)
{
if(ch[i]!=m[2].second)
{
tt--;
if(tt<0)
{
puts("no");
return ;
}
}
else tt++;
}
}
break;
}
}
if(tt==0)
{
puts("yes");
}
else
{
puts("no");
}
}
}*/
//上面的这种写法在AABB这种情况下回出错,因为排序后顺序被弄乱了。正着测试一次反着测试一次较好,不易出错。
inline void to()
{
scanf("%s", ch + 1);
m[0].first=m[1].first=m[2].first=0;
m[0].second=m[1].second=m[2].second=' ';
int n=strlen(ch+1);
for(int i=1;i<=n;i++)
{
m[ch[i]-'A'].first++;
m[ch[i]-'A'].second=ch[i];
}
sort(m,m+3);
if(m[2].first!=m[1].first+m[0].first)
{
puts("no");
return ;
}
else //如果是AABB的话要测试两次,正着试一次反着试一次。
{
int tt=0;
int flag=1;
for(int i=1;i<=n;i++)
{
if(ch[i]==m[2].second) //first 与second 写混易错。
{
tt++;
}
else
{
tt--;
}
if(tt<0)
{
// cout<<" tt"<<tt<<endl;
flag=0;break;
}
}
if(tt==0)
{
puts("yes");return ;
}
if(flag==0)
{
tt=0;
for(int i=1;i<=n;i++)
{
if(ch[i]!=m[2].second)
{
tt++;
}
else
{
tt--;
}
if(tt<0)
{
puts("no");
return ;
}
}
if(tt==0)
{
puts("yes");
return ;
}
puts("no");
return ;
}
}
}
signed main()
{
int t;
read(t);
while (t--)
{
to();
}
return 0;
}