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
题解:其实就是递归。仿照别人的代码。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <string>
using namespace std;
char temp[] = "anniversary";
char s[105];
int len;
int tlen = strlen(temp);
int find(int x1,int x2) //找到最大匹配串
{
int k = 0;
while(x1 < len && x2 < tlen && s[x1] == temp[x2])
{
x1++;
x2++;
k++;
}
return k; //匹配个数
}
bool solve(int x1,int x2,int t)
{
if(x2 >= tlen) return true; //找到了
if(3 == t) return false; //大于3个连接串
for(int i = x1;i < len;i++) //每一个与匹配串匹配第x2个匹配
{
if(s[i] == temp[x2])
{
int k = find(i,x2);
if(solve(i + k,x2 + k,t + 1)) //找下一个匹配串
return true;
}
}
return false;
}
int main()
{
int ncase;
cin>>ncase;
while(ncase--)
{
scanf("%s",s);
len = strlen(s);
if(solve(0,0,0))
printf("YES\n");
else
printf("NO\n");
}
return 0;
}