小A很喜欢对着别人”233”,然后他发现有很多数字可以提取出他喜欢的233的子序列(一个数字由a[1,2,3...k]k个字符来表示,可以找到a[i]='2',a[j]='3',a[k]='3'保证i<j<k)。于是乎自以为是的他决定自己定义一种Tricky数,这种数字在不重复利用每一位的条件下,可以提取出k(k>0)个子序列,而且保证提取出这k个子序列都是”233”,且不再剩余任何数字。
子序列:某个序列的子序列是从最初序列中任意取出一些元素,在不破坏原始的顺序基础上排成的序列。
第一行输入一个正整数T,表示数据组数 T<=1000 每组数据一行输入一个数字v(0<v<=10^1000)
对于每组数据如果v是Tricky数,输出”Yes” , 否则输出”No”
2 232333 233323
Yes No
k个字符和k个子序列不是同一个k
题目大意:给你一个仅由2和3构成的字符串,要求每一个2可以和后面的两个3构成233字串,并且字串中
的每一个字符都要用到,从左往右扫描,分别记录2和3的个数,遇到两个3就可以减去一个2。
#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
string s;
cin>>s;
int len=s.length();
int t1=0,t2=0;
if(s[0]=='3'||len<=2)
{
printf("No\n");
continue;
}
int flag=1;
for(int i=0;i<len;i++)
{
if(s[i]=='2')
t1++;
else
if(s[i]=='3'&&t2==1)
{
t1--;
t2=0;
}else
{
t2++;
}
if(t2>2*t1)
{
flag=0;
break;
}
}
if(t1!=0||t2!=0)
flag=0;
if(flag)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}