Hidden String
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 1691 Accepted Submission(s): 597
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 <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
char a[105];
char b[20]="anniversary";
int len;
int flag;
void dfs(int p1,int p2,int cnt)
{
if(cnt>3)
{
return;
}
if(p2>=11)
{
flag=1;
return;
}
for(int i=p1;i<len;i++)
{
int x=i,y=p2;
while(a[x]==b[y])
x++,y++;
dfs(x+1,y,cnt+1);//不相等,那么就继续往后找下一个区间
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
flag=0;
scanf("%s",a);
len=strlen(a);
dfs(0,0,0);
if(flag)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
char a[105];
char b[20]="anniversary";
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%s",a);
int len=strlen(a),t=0,cnt=0,flag=0;
for(int i=0;i<len;i++)
{
if(a[i]==b[t])
{
t++;
if(flag==0)//刚开始匹配成功
{
flag=1;
cnt++;
}
}
else
{
flag=0;
}
}
if(cnt<=3&&t==11)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
return 0;
}