把目标中的 U 转化为 I。
又因为 I的个数是有规律的:1 2 4 8 16 。。。再结合可以取消 6 12 18 。。。个I。。。得解
#include<string.h>
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
const int maxn = 1000000+5;
map<int,int>mp;
void init(){
mp.clear();
int tt = 1;
while( tt<maxn ){
mp[ tt ] = 1;
int tmp = tt;
while( mp[tt]==1&&tmp>=6 ){
mp[ tmp ] = 1;
tmp -= 6;
}
tt *= 2;
}
}
int main(){
int n;
init();
scanf("%d",&n);
while( n-- ){
string s;
cin>>s;
int ans = 0;
int len = s.size();
int ans2 = 0;
bool f = true;
for( int i=1;i<len;i++ ){
if( s[i]=='I' ){
ans++;
}
else if( s[i]=='U' ){
ans += 3;
}
else f = false ;
}
if( mp[ans]==1&&f==true&&s[0]=='M' ) puts("Yes");
else puts("No");
}
return 0;
}