Hidden String
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 1729 Accepted Submission(s): 605
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
解题思路先求出最长前缀再求最长后缀暴力枚举中间
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
char s[20]={"anniversary"};
char str[110];
int main()
{
int t,i,j,k;
scanf("%d",&t);
while(t--){
scanf("%s",str);
int len=strlen(str);
int l=110,r=-1,l1=110,r1=0;
for(i=0;i<len;++i){
if(str[i]=='a'){
for(j=i,k=0;j<len;++j){
if(str[j]==s[k])k++;
else break;
}
if(k-1>r){
r=k-1;
l1=j;
}
}
if(str[len-i-1]=='y'){
for(j=len-i-1,k=10;j>=0;--j){
if(str[j]==s[k])k--;
else break;
}
if(k+1<l){
l=k+1;
r1=j;
}
}
}
if(r+1>=l&&l1<=r1){
printf("YES\n");
}
else {
if(r==10||l==0){
printf("YES\n");
continue;
}
bool flag=false;
for(j=l1;j<=r1;++j){
if(str[j]==s[r+1]){
k=r+1;
for(int ss=j;ss<=r1;++ss){
if(str[ss]==s[k])k++;
else break;
}
if(k>=l){
flag=true;break;
}
}
}
if(flag){
printf("YES\n");
}
else {
printf("NO\n");
}
}
}
return 0;
}