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#include<stdio.h> #include<string.h> int main() { char s[12]="anniversary"; char S[50][3][12];int len[50][3]; int i,j,k,sum=0; for(i=1;i<11;i++) { for(j=i+1;j<11;j++) { for(int i1=0;i1<i;i1++) S[sum][0][i1]=s[i1]; S[sum][0][i]='\0'; for(int i1=i;i1<j;i1++) S[sum][1][i1-i]=s[i1]; S[sum][1][j-i]='\0'; for(int i1=j;i1<11;i1++) S[sum][2][i1-j]=s[i1]; S[sum][2][11-j]='\0'; len[sum][0]=i; len[sum][1]=j-i; len[sum][2]=11-j; sum++; } } int T; char str[110]; scanf("%d",&T); while(T--) { scanf("%s",str); int F=1; for(i=0;i<sum&&F;i++) { char *P,*P1,*P2; P=str; P=strstr(P,S[i][0]); while(P!=NULL&&F) { P1=P; P1=strstr(P1+len[i][0],S[i][1]); while(P1!=NULL&&F) { P2=P1; P2=strstr(P2+len[i][1],S[i][2]); if(P2!=NULL)F=0; P1=strstr(P1+1,S[i][1]); } P=strstr(P+1,S[i][0]); } } if(F)puts("NO"); else puts("YES"); } }我的思路比较水,就是把“anniversary"字符串可以分的情况全部找出来,然后在输入的字符串中看看可以找到不。