http://acm.hdu.edu.cn/showproblem.php?pid=1797
就是模拟
我的思路是标记aba 和h的位置
然后就判断是否正确 就行了
还有就是 最后 fkfkfkfk交叉也可以
#include <iostream> #include <cstring> #include <algorithm> #include <queue> #include <cstdio> #include <cstdlib> #include <cctype> #include <math.h> #include <ctype.h> using namespace std; #define memset(a,b) memset(a,b,sizeof(a)) #define N 101000 typedef long long ll; char str[N]; int main() { int T; scanf("%d",&T); while(T--) { int flag=0; scanf("%s",str); int len=strlen(str); int abc,h; abc=h=-1; if(strstr(str,"aba")) abc=strstr(str,"aba")-str; if(strstr(str,"h")) h=strstr(str,"h")-str; if(abc==-1 || h==-1 || h==len-1) flag=1; for(int i=0; i<abc; i++) { if(str[i]!='a') { flag=1; break; } } int v1=0,v2=0; for(int i=abc+3; i<h; i++) { if(str[i]!='b' && str[i]!='d') { flag=1; break; } if(str[i]=='d' && str[i]=='b') { flag=1; break; } if(str[i]=='b') v1++; if(str[i]=='d') v2++; } if(v1!=0 && v2==0) flag=1; if(v1>1) flag=1; v1=v2=0; for(int i=h+1; str[i]; i++) { if(str[i]!='f' && str[i]!='k') { flag=1; break; } if(str[i]=='f') v1++; if(str[i]=='k') v2++; } if(v1==0 && v2==0) flag=1; if(v1==0 && v2==0 && v1!=v2) flag=1; if(flag==1) printf("NO "); else printf("YES "); } return 0; }