hdu5311--Hidden String

题目大意:给出一个母串,一个模式串,把模式串任意分成三部分,在母串中按顺序匹配,问是否存在这样子的匹配。

分析:暴力。枚举两个分割的位置,然后判断第一部分是否有相应的匹配,匹配成功则母串中的指针指向分割位置+1,再判断第二部分第三部分,同理。当然,第三部分匹配成功就return true。


代码:

#include <cstdio>
#include <cstring>

char s[200], t[] = "anniversary";
int len;


bool ok(int x, int y) {
    int f1 = 0, f2 = 0, f3 = 0;
    for(int i = 0; i < len; i++) {
        if(!f1) {
            if(s[i] == t[0]) {
                int f = 1;
                for(int j = 1; j <= x && f; j++)
                    if(s[i+j] != t[j]) f = 0;
                if(f) {
                    i = i+x;
                    f1 = 1;
                }
            }
        }
        else if(!f2) {
            if(s[i] == t[x+1]) {
                int f = 1;
                for(int j = x+2; j <= y && f; j++)
                    if(s[i+j-x-1] != t[j]) f = 0;
                if(f) {
                    i = i+y-x-1;
                    f2 = 1;
                }
            }

        }
        else if(!f3) {
            if(s[i] == t[y+1]) {
                int f = 1;
                for(int j = y+2; j <= 10 && f; j++)
                    if(s[i+j-y-1] != t[j]) f = 0;
                if(f) return true;
            }
        }
    }
    return false;
}


int main() {
    int T;
    scanf("%d", &T);
    while(T--) {
        scanf("%s", s);
        len = strlen(s);
        int flag = 0;
        for(int i = 0; i < 9 && !flag; i++)
            for(int j = i+1; j < 10 && !flag; j++)
                if(ok(i, j)) flag = 1;
        if(flag) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}


你可能感兴趣的:(hdu5311--Hidden String)