Hidden String
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 2018 Accepted Submission(s): 766
Problem Description
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. 1≤l1≤r1<l2≤r2<l3≤r3≤n
2. The concatenation of s[l1..r1] , s[l2..r2] , s[l3..r3] is "anniversary".
1. 1≤l1≤r1<l2≤r2<l3≤r3≤n
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
(1≤T≤100)
, 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.
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
代码如下:
#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdio>
using namespace std;
string s,word="anniversary";
bool flag;
int lens,lenw;
void dfs(int num, int index,int word_index){
if (flag) return;
if (num<=3 && word_index>=lenw) {
flag=1;
return;
}
if (index>=lens) return;
if (word_index>=lenw) return;
if (num>3) return;
int i=index;
int k=word_index;
while (i<lens){
if (s[i]==word[k]){
int tmp=i;
while (s[tmp]==word[k] && tmp<lens && k<lenw) {
tmp++; k++;
};
dfs(num+1,tmp,k);
if (flag) return;
k=word_index;
}
i++;
}
}
int main(){
std::ios::sync_with_stdio(false);
lenw=word.length();
int t;
cin>>t;
while (t--){
cin>>s;
flag=0;
lens=s.length();
dfs(0,0,0);
if (flag) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}