贲神的故事2
时间限制(普通/Java) : 1000 MS/ 3000 MS 运行内存限制 : 65536 KByte
总提交 : 42 测试通过 : 10
总提交 : 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");
}
}
}