题目:http://acm.hdu.edu.cn/showproblem.php?pid=4662
题目大意:三种字符‘M’、'U'、'I',有三种变换,M后面的字符都可以加倍,三个连续的‘I’可以变成一个‘U’,可以删掉连续的两个‘U’,给你一个字符串,问你能不能由“MI”经过变换得到。
思路:所有合法串都是肯定是由‘M’开始的,后面的不可能有‘M’。所有合法串中的M+3I %6 都为2或者4,另外,M+3I %6 为2或者4的都是合法串。仅有的反例是 MI 。
代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN = 1e6 + 10 ;
char str[MAXN];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%s",str);
if(str[0]!='M')
{
puts("No");
continue;
}
int len = strlen(str);
int ok =1;
int num = 0;
for(int i = 1;i<len;i++)
if(str[i]=='I')
num ++ ;
else if(str[i]=='U')
num += 3;
else if(str[i]=='M')
{
ok = 0;
break;
}
if(!ok)
{
puts("No");
continue;
}
if(num==1)
{
puts("Yes");
continue;
}
ok = 0;
int t =num%6;
if(t==2 || t==4)
ok=1;
if(ok) puts("Yes");
else puts("No");
}
return 0;
}