Hidden String
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 1715 Accepted Submission(s): 604
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
题意:在给出的串中是否存在三个子串可以连接成anniversary,且这三个串在给出的串中的位置是依序的不存在重叠。
一直想着KMP怎么搞,原来给出串长度才100,暴力就行了。先在anniversary串中枚举三个子串,再在给出的串中按序查找是否存在这些串就行了,简直水题,我真是智障。。。
代码如下:
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
string s="anniversary";
string str,s1,s2,s3;
int len_s,len_str;
int main()
{
int sign,t,i,j,k;
scanf("%d",&t);
while(t--)
{
cin>>str;
len_s=s.length();
len_str=str.length();
sign=0;
for(i=1;i<=len_s-2;++i)//i表示第一个串的长度
{
for(j=1;j<=len_s-1-i;++j)//j表示第二个串的长度
{
k=len_s-i-j;//k表示第三个串的长度
s1=s.substr(0,i);//从0位开始往后截取i长度的串
s2=s.substr(i,j);
s3=s.substr(j+i,k);
int st1=str.find(s1,0);//从第0位开始找s1,找到返回s1串存在的地址,找不到返回-1
if(st1==-1)//第一个串错误了,直接跳出确定第二个串的循环
break;
int st2=str.find(s2,st1+i);
if(st2==-1)
continue;
int st3=str.find(s3,st2+j);
if(st3==-1)
continue;
sign=1;
printf("YES\n");
break;
}
if(sign)
break;
}
if(!sign)
printf("NO\n");
}
return 0;
}