HDU 4662 MU Puzzle:找规律
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4662
题意:
初始字符串为"MI"。
有三个操作:
(1)将'M'之后的所有字符翻倍。For example: MIU to MIUIU.
(2)将'III'变为一个'U'。For example: MUIIIU to MUUU.
(3)删除'UU'。For example: MUUU to MU
给你一个字符串s,问你是否能将初始字符串"MI"通过一系列操作变为s。
题解:
(1)因为'III'='U',所以令'I'=1,'U'=3.(操作2)
(2)假设不进行操作3的话,将所有的'U'还原成'III','I'的个数为2的幂次方,也就是所有'U','I'之和为2^n。(操作1)
(3)加上操作3,每删除一次'UU','U','I'之和减去6,所以sum = 2^n - k*6。(操作3)
那么。。。打个表试试吧 (〃'▽'〃)
1,2,4,8,10,14,16,20,26,32,34,40,46,52,58,64...
哇有规律哦!
sum为不能被3整除的偶数,或者1。
所以读入的时候统计一下'U','I'之和,判断一下就好啦。
AC Code:
1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 5 using namespace std; 6 7 int cases; 8 string s; 9 10 int main() 11 { 12 cin>>cases; 13 while(cases--) 14 { 15 cin>>s; 16 bool flag=true; 17 int sum=0; 18 if(s[0]!='M') flag=false; 19 for(int i=1;i<s.size() && flag;i++) 20 { 21 if(s[i]=='I') sum++; 22 else if(s[i]=='U') sum+=3; 23 else flag=false; 24 } 25 if((sum&1) || sum%3==0) flag=false; 26 if(flag || s=="MI") cout<<"Yes"<<endl; 27 else cout<<"No"<<endl; 28 } 29 }