hdu 4662 (字符串变换)

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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值