Match the string--hdu1797(模拟)

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;
}
原文地址:https://www.cnblogs.com/linliu/p/5399242.html