HDU5311——字符串——Hidden String

Today is the 1st anniversary of BestCoder. Soda, the contest manager, gets a string s of length n. He wants to find three nonoverlapping substrings s[l1..r1]s[l2..r2]s[l3..r3] that:

1. 1l1r1<l2r2<l3r3n

2. The concatenation of s[l1..r1]s[l2..r2]s[l3..r3] is "anniversary".

 


Input
There are multiple test cases. The first line of input contains an integer  T (1T100), indicating the number of test cases. For each test case:

There's a line containing a string s (1|s|100) consisting of lowercase English letters.
 


Output
For each test case, output "YES" (without the quotes) if Soda can find such thress substrings, otherwise output "NO" (without the quotes).
 


Sample Input
2 annivddfdersewwefary nniversarya
 


Sample Output
YES NO
 


Source
 


Recommend
hujie   |   We have carefully selected several similar problems for you:   5315  5314  5313  5312  5310 
/*

先求出前缀和后缀匹配,注意anniversaxxrxxy这组数据。。被卡了一上午,,因为访问到第二个a的时候会让前缀变成1

然后就for循环找中间匹配的串,保证这个串的第一个和最后一个与头尾相连

比赛的时候狗血代码都过了- -。。。如果自己hack自己涨分的话......

*/

#include <cstdio>

#include <cstring>

#include <algorithm>

#include <vector>

using namespace std;



char  s1[110];

char s2[110] = "anniversary";

int pre1[110], pre2[110];

int T;

int main()

{

    scanf("%d", &T);

    while(T--){

        scanf("%s", s1);

        int len1 = strlen(s1);

        int len2 = strlen(s2);

        memset(pre1, 0, sizeof(pre1));

        memset(pre2, 0 ,sizeof(pre2));

        int cout = 0;

        for(int i = 0 ; i < len1; i++){

            if(s1[i] == 'a' && cout == 0){

                pre1[i] = 1;

                cout = 1;

            }

            else if(s1[i] == s2[cout]){

                pre1[i] = pre1[i-1] + 1;

                cout++;

            }

            else {

                pre1[i] = 0;

                cout= 0;

            }

        }

        //    for(int i = 0; i < len1; i++)

        //        printf("%d ",pre1[i]);

        cout = 0;

        for(int i = len1 - 1; i >= 0 ; i--){

            if(s1[i] == 'y'){

                pre2[i] = 1;

                cout = 1;

            }

            else if(s1[i] == s2[len2 - cout-1]){

                pre2[i] = pre2[i+1] + 1;

                cout++;

            }

            else {

                pre2[i] = 0;

                cout = 0;

            }

        }

        //  for(int i = 0 ; i < len1; i++)

        //      printf("%d ",pre2[i]);



        int flag = 0;



        cout = 0;

        for(int i = 0 ; i < len1 ; i++){

            for(int j = i + 1; j < len1; j++){

                cout = 0;

                for(int k = i + 1; k < j; k++){

                    if(s1[k] == s2[pre1[i]+cout]){

                        cout++;

                    }

                    else {

                        cout = 0;

                        if(s1[k] == s2[pre1[i]+cout])

                            cout++;

                    }

                    if(cout + pre1[i] + pre2[j] == len2 && s1[k] == s2[len2 - pre2[j] - 1]){

                        flag = 1;

                        break;

                    }

                }

                if(flag) break;

            }

            if(flag) break;

        }

        //   for(int i = 0 ; i < len1; i++)

        if(flag) printf("YES\n");

        else printf("NO\n");

    }

    return 0;

}

  

你可能感兴趣的:(String)