HDU 5284 wyh2000 and a string problem(字符串,水)
题意:比如给你一个串,要求判断wyh是不是它的子序列,那么你只需要找一个w,找一个y,再找一个h,使得w在y前面,y在h前面即可。有一天小学生拿着一个串问他“wyh是不是这个串的子序列?”.但是wyh2000有重度近视眼,如果字符串中有一段连续的v(至少两个),那么他会把它看成一个w。例如,字符串vvv会被看成w,字符串vvwvvv会被看成www,字符串vwvv会被看成vww。请问wyh2000会怎么回答这个问题?输出yes和no。
思路:其实就是将两个以上的v换成w,再来看是否能有'wyh'子串的存在。可以写更技巧些,但是为了快,就随便写了。还好过了。
//#include <bits/stdc++.h> #include <cstdio> #include <cstring> #include <iostream> #define LL long long #define pii pair<int,int> #define INF 0x7f7f7f7f using namespace std; const int N=4000000; char s[N]; char ans[N]; int main() { //freopen("input.txt", "r", stdin); int t; cin>>t; while(t--) { scanf("%s",s); int len=strlen(s); int p=0; ans[++p]=s[0]; for(int i=1; i<len; i++)//替换掉 { if(ans[p]=='v'&&s[i]=='v') { ans[p]='w'; while(s[i]=='v') i++; i--; } else ans[++p]=s[i]; } ans[++p]='\0'; len=p; int i=1; bool w=false, y=false, h=false; while(i<len&&ans[i]!='w') i++;//找3个字符出来 if(i<len&&ans[i]=='w') w=1; while(i<len&&ans[i]!='y') i++; if(i<len&&ans[i]=='y') y=1; while(i<len&&ans[i]!='h') i++; if(i<len&&ans[i]=='h') h=1; if(w&&y&&h) puts("Yes"); else puts("No"); } return 0; }