南邮 OJ 1952 贲神的故事2

贲神的故事2

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

比赛描述

妹子:说你爱我!

贲神:不说!

妹子:快说你爱我!

贲神:不说!

…………

妹子:你快说嘛!

贲神:好吧好吧。watashilostvectoryou

贲神真的说了呦,不过妹子觉得很不爽,所以她想吧句子里面包含“love”的最短的字符串找出来(如果有多个的话找出最左边的),你能帮帮她么?



输入

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

每组数据有一行,为一个小写字母组成的字符串,长度不超过10000

输出

若可以找到“love”,则输出"l"最早出现的位置(默认第一个字符的位置为1),若找不到,则输出-1.

样例输入

1
watashilostvectoryou

样例输出

8

题目来源

张飞





/* Wrong Answer at Test 1

#include<iostream>

int main(){
	char a[10001];
	int t,i,j,strLen,pos,minLen=INT_MAX;
	bool flagO,flagV,flagE;
	scanf("%d",&t);
	while(t--){
		scanf("%s",a);
	}
	strLen = (int)strlen(a);
	for(i=0;i<strLen;i++){
		if(a[i]=='l'){
			flagO = flagV = flagE = 0;
			for(j=i+1; !flagE && j<strLen; j++){
				switch(a[j]){
				case('l'):
					break;
				case('o'):
					flagO = 1;
					break;
				case('v'):
					if(flagO){
						flagV = 1;
					}
					break;
				case('e'):
					if(flagV){
						flagE = 1;
					}
					break;
				default:
					break;
				}
			}
			if(flagE && minLen>j-i+1){
				minLen = j-i+1;
				pos = i+1;
			}
		}
	}
	if(minLen!=INT_MAX){
		printf("%d\n",pos);
	}else{
		printf("-1");
	}
}
*/



/* 31MS
#include<iostream>

int main(){
	char a[10001];
	int t,i,j,strLen,pos,minLen;
	bool flagO,flagV,flagE;
	scanf("%d",&t);
	while(t--){
		scanf("%s",a);
		minLen=INT_MAX;
			strLen = (int)strlen(a);
		for(i=0;i<strLen;i++){
			if(a[i]=='l'){
				flagO = flagV = flagE = 0;
				for(j=i+1; !flagE && j<strLen; j++){
					switch(a[j]){
					case('l'):
						break;
					case('o'):
						flagO = 1;
						break;
					case('v'):
						if(flagO){
							flagV = 1;
						}
						break;
					case('e'):
						if(flagV){
							flagE = 1;
						}
						break;
					default:
						break;
					}
				}
				if(flagE && minLen>j-i+1){
					minLen = j-i+1;
					pos = i+1;
				}
			}
		}
		if(minLen!=INT_MAX){
			printf("%d\n",pos);
		}else{
			printf("-1\n");
		}
	}
}
*/


#include<iostream>

int main(){
	char a[10001];
	int t,i,j,strLen,pos,minLen;
	bool flagO,flagV,flagE;
	scanf("%d",&t);
	while(t--){
		scanf("%s",a);
		minLen=INT_MAX;
			strLen = (int)strlen(a);
		for(i=0;i<strLen;i++){
			if(a[i]=='l'){
				flagO = flagV = flagE = 0;
				for(j=i+1; !flagE && j<strLen; j++){
					switch(a[j]){
					case('l'):
						if(!flagO){		//这个剪枝将时间从31MS 降到了 0MS
							i = j;
						}
						break;
					case('o'):
						flagO = 1;
						break;
					case('v'):
						if(flagO){
							flagV = 1;
						}
						break;
					case('e'):
						if(flagV){
							flagE = 1;
						}
						break;
					default:
						break;
					}
				}
				if(flagE && minLen>j-i+1){
					minLen = j-i+1;
					pos = i+1;
				}
			}
		}
		if(minLen!=INT_MAX){
			printf("%d\n",pos);
		}else{
			printf("-1\n");
		}
	}
}


你可能感兴趣的:(ACM,南邮OJ,贲神的故事2)