MU Puzzle HDU - 4662

Posted joeylee97

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MU Puzzle HDU - 4662相关的知识,希望对你有一定的参考价值。

Suppose there are the symbols M, I, and U which can be combined to produce strings of symbols called "words". We start with one word MI, and transform it to get a new word. In each step, we can use one of the following transformation rules: 
1. Double any string after the M (that is, change Mx, to Mxx). For example: MIU to MIUIU. 
2. Replace any III with a U. For example: MUIIIU to MUUU. 
3. Remove any UU. For example: MUUU to MU. 
Using these three rules is it possible to change MI into a given string in a finite number of steps? 

InputFirst line, number of strings, n. 
Following n lines, each line contains a nonempty string which consists only of letters ‘M‘, ‘I‘ and ‘U‘. 

Total length of all strings <= 10 6.Outputn lines, each line is ‘Yes‘ or ‘No‘.Sample Input

2
MI
MU

Sample Output

Yes
No

所有U都是由I换来的,而U不能再换成I,所以可以讲所有U换成I的数目进行统计,如果符合要求即可
1.相当于I的数目*2
3.相当于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;
}

 

以上是关于MU Puzzle HDU - 4662的主要内容,如果未能解决你的问题,请参考以下文章

MU puzzle

hdu1098:Ignatius's puzzle

人生第一个快速幂的题(HDU - 1097--A hard puzzle )

『HDU 4053』The Last Puzzle

HDU 2514 Another Eight Puzzle(DFS)

HDU 5465 Clarke and puzzle Nim游戏+二维树状数组