南邮 OJ 1974 BRN

BRN

时间限制(普通/Java) :  1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 131            测试通过 : 37 

比赛描述

大学四事之娱乐生活。

Best Riven NUPT ,即南邮最强瑞文,作为一个LOSER,啊不,LOLERBENBB一直向着这个目标努力练习着。

作为英雄联盟中最需要操作的几个英雄之一,一个优秀的瑞文玩家,需要掌握其特殊的连招技巧!瑞文的主要技能为QWER,加上A人和鼠标右键总计6种操作命令。这里我们把鼠标右键记作1

要想有效的在与敌人的较量中获得胜利,就需要在短时间内打出更多的伤害,即取消游戏中的前摇和后摇。具体方法如下:

  1. 在使用Q技能之后用鼠标右键可以取消Q的施法后摇。

  2. A之后使用Q技能能取消A的后摇。

  3. E技能之后使用W或者R可以取消施法前摇。

……

如此一来我们定义下BRN所需要的操作吧。

 1Q之后必须接上鼠标右键1

2A之后必须接上Q技能。

3WR之前必须是E技能。

4RW之后必须接上Q技能或者A

5、其余技能可以随意连接

BENBB在练习中释放了很多次技能,现在请你找出其中最长的满足BRN需求的连招的长度。

有多组输入输出。




输入

第一行为一个正整数T,表示有T组数据

每组为一行字符串(长度不超过10000,所有字母都为大写)


输出

每组单独一行输出一个正整数m代表最长BRN连招长度 


样例输入

3
AQ1A
QWERA1
ERQ1AQ1EWAQ1111111ERA

样例输出

4
3
21

题目来源

BYK




#include<iostream>

#define MAX_N 10001
char a[MAX_N];

int main(){
	int t,i,len,count,max_count;
	bool flag;
	scanf("%d",&t);
	while(t--){
		scanf("%s",a);
		len = (int)strlen(a);
		count = max_count = 0;
		for(i=0;i<len;i++){
			switch(a[i]){
			case 'Q':					//Q之后必须接上鼠标右键1。
				if(i+1<len && a[i+1]!='1'){
					count++;
					if(count>max_count){
						max_count = count;
					}
					count = 0;
				}else{
					count++;
					if(count>max_count){
						max_count = count;
					}
				}
				break;
			case 'A':					//A之后必须接上Q技能
				if(i+1<len && a[i+1]!='Q'){
					count++;
					if(count>max_count){
						max_count = count;
					}
					count = 0;
				}else{
					count++;
					if(count>max_count){
						max_count = count;
					}
				}
				break;
			case 'W':	case 'R':		//W和R之前必须是E技能。
				flag = 0;
				if(i-1>=0 && a[i-1]!='E'){
					count = 0;
					flag = 1;
				}
				if(i+1<len && a[i+1]!='Q' && a[i+1]!='A'){	//R和W之后必须接上Q技能或者A
					count++;
					if(count>max_count){
						max_count = count;
					}
					count = 0;
					flag = 1;
				}
				if(!flag){
					count++;
					if(count>max_count){
						max_count = count;
					}
				}
				break;
			default:
				count++;
				if(count>max_count){
					max_count = count;
				}
			}
		}
		printf("%d\n",max_count);
	}
}


你可能感兴趣的:(ACM,南邮OJ,BRN)