Sample Input
2 MI MU
Sample Output
Yes No
1. Double any string after the M (that is, change Mx, to Mxx). For example: MIU to MIUIU. ( M后面得字符串复制一遍)
2. Replace any III with a U. For example: MUIIIU to MUUU. (III可变成一个U)
3. Remove any UU. For example: MUUU to MU. (两个UU可以删去)
题意 : 给一个串S,问是否可以从串MI通过上述的三中变换规则变换到S ;
如果穿S里面有U,这这个U是通过,三个III变过来的 ,所以,把串S里统计I的个数sum. 因为MI通过复制得到的I,都是2^k个,都是偶数 所以如果sum为奇数.
则不可能. 如果sum为偶数,要枚举,num,num是2^k个I,复制了好多次. 如果 num-sum是6的倍数,才行. (两个UU是6个I),要消去.
#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <string> using namespace std; const int MAXN = 1000000 + 11; char str[MAXN]; int main() { int T; while (scanf("%d", &T) != EOF) { while (T--) { scanf("%s", str); if (str[0] != 'M') //第一个不是M,则NO { printf("No\n"); continue; } int sum = 0; int len = strlen(str); int temp = 1; for (int i = 1; i < len; i++) { if (str[i] == 'M') { temp = 0; break; } if (str[i] == 'U') //统计sum { sum += 3; } else { sum++; } } if (temp == 0) //M大一1,则NO { printf("No\n"); break; } if (sum == 1) //MI本身,不用变. { printf("Yes\n"); continue; } int flag = 0; for (int i = 0; i < 32; i++) //枚举NUM { if ((1 << i) > sum && ((1 << i) - sum) % 6 == 0) //(1 << i) - sum)是要删除掉的 { flag = 1; break; } } if (flag) { printf("Yes\n"); } else { printf("No\n"); } } } // system("pause"); return 0; }