这道题还是比较简单的,题意是判断能否将MI按照给定要求进行变换,使得其能变成给定字符串,如果能则为“yes”,否则为“no”:
1.一个U == III,所以,我们对给定的字符串进行统计I的个数,如果是I就sum++,如果是U,就sum+=3;
2.M后的字符可以成倍复制,个数为1、2、4...是2的n次幂,一开始只需判断I的个数是不是2的n次幂就行了,后来发现两个UU是可以消去的,
也就是6个I的时候可以消去,这样十个I虽不是2的n次幂,但也是“yes”;
1.一个U == III,所以,我们对给定的字符串进行统计I的个数,如果是I就sum++,如果是U,就sum+=3;
2.M后的字符可以成倍复制,个数为1、2、4...是2的n次幂,一开始只需判断I的个数是不是2的n次幂就行了,后来发现两个UU是可以消去的,
也就是6个I的时候可以消去,这样十个I虽不是2的n次幂,但也是“yes”;
3.有些细节简单判断一下就可以,比如,如果第一个字符不是‘M’,一定是'no'之类的,,
具体代码如下:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<iostream>
const int maxn = 1000010;
int main(){
int t,sum;
char c[maxn];
scanf("%d",&t);
while(t--){
int f=1;
sum=0;
scanf("%s",c);
int l=strlen(c);
if(c[0]!='M'){
printf("No\n");
continue;
}
else{
for(int i=1;i<l;i++){
if(c[i]=='M'){ f=0;break;}
else if(c[i]=='U')sum+=3;
else if(c[i]=='I')sum++;
}
}
if(f==0){printf("No\n");
continue;
}
else if(sum==1){
printf("Yes\n");
continue;
}
else if(sum%2==1){
printf("No\n");
continue;
}
else{
for(int j=0;j<=25;j++)
{
if(((1<<j)-sum%6)==0){
f=0;
break;
}
}
if(f==0)printf("Yes\n");
else printf("No\n");
}
}
return 0;
}