题意:问能否从字符串"MI"经过以下3种操作转化到一个给定的字符串:
1、'M'后的字符串复制;2、'III'可变成'U';3、"UU"可删掉。
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4662
——>>统计‘I’的个数,1个‘U’转为3个‘I’,2的次方数减去‘I’的个数能否被6整除。
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 1000000 + 10;
char s[maxn];
int p[30];
void init(){
p[0] = 1;
for(int i = 1; i < 30; i++) p[i] = (p[i-1] << 1);
}
bool solve(){
bool ok = 0;
int len = strlen(s), i, Mcnt = 0, Icnt = 0;
for(i = 0; i < len; i++){
if(s[i] == 'M') Mcnt++;
else if(s[i] == 'I') Icnt++;
else if(s[i] == 'U') Icnt += 3;
}
if(Mcnt == 1 && s[0] == 'M'){
for(i = 29; i >= 0; i--) if(p[i] >= Icnt && (p[i] - Icnt) % 6 == 0) {
ok = 1;
break;
}
}
return ok;
}
int main()
{
int n;
init();
scanf("%d", &n);
getchar();
while(n--){
scanf("%s", s);
if(solve()) printf("Yes\n");
else printf("No\n");
}
return 0;
}