题意:匹配串为"anniversary",对于每个给定串,为是否存在不多于3段连续子串能拼成匹配串;(n<=100)
思路:两个串从首部开始搜,若匹配次数不大于3则成功,否则不成功;
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int t,n,m,len,flag; char ch[15]="anniversary"; char str[500010]; void dfs(int a,int b,int step) { if(step<=3&&!ch[b]){ //匹配串只遍历一次 flag=1;return; } if(step>3||!ch[b]||!str[a]) return; dfs(a+1,b,step); if(str[a]==ch[b]){ while(str[a]==ch[b]&&str[a]&&ch[b]){ a++;b++; } dfs(a,b,step+1); } } int main() { int i,j,k; while(scanf("%d",&t)!=EOF) { while(t--) { flag=0; scanf("%s",str); len=strlen(str); dfs(0,0,0); if(flag) printf("YES\n"); else printf("NO\n"); } } return 0; }
时间: 2024-11-12 07:39:55