题意中要注意的是使后面的字串加倍是使所有的字串加倍 英文有毒 所有U都是3各I组成的 所以加倍只能有2 4 6 8 16 ....1<<n的I
又因为可以同时删去UU 即删去6个I 所以如果一个串可以被生成 则该串后面 转换成的I数要么是2的幂 要么是2得幂-6的倍数
#include<bits/stdc++.h>
using namespace std;
char s[1000010];
int main()
{
int n;
while(cin>>n)
{
while(n--)
{
scanf("%s",s);
if(strcmp(s,"MI")==0)
{
printf("Yes\n");
continue;
}
if(s[0]!='M')
{
printf("No\n"); //M III III III III III I
continue;
}
int len=strlen(s);//M IIII II IIIIII III I
int ok=1;
int flagI=0;
int flagU=0;
for(int i=1; i<len; i++)
{
if(s[i]=='M')
{
ok=0;
}
if(s[i]=='I')
{
flagI++;
}
if(s[i]=='U')
flagU++;
if(ok==0)
break;
}
int flag=flagI+flagU*3;
int z=2;
int flagok=0;
if(ok)
{
while(z<1<<30){
if(z>=flag&&(z-flag)%6==0){
flagok=1;break;
}
else z=z<<1;
}
}
if(flagok)
printf("Yes\n");
else
printf("No\n");
}
}
return 0;
}