BestCoder 1st Anniversary ($) HDU5311 Hidden String

49 篇文章 0 订阅
35 篇文章 0 订阅




Hidden String

                                               Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)
                                                                            Total Submission(s): 1574    Accepted Submission(s): 561


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.  1l1r1<l2r2<l3r3n

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  (1T100) , 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.
 

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




出题人:这个题怎么暴力怎么搞就好了. 可以枚举最长匹配前缀, 

和最长匹配后缀, 中间暴力for.



#include
    
    
     
     
#include
     
     
      
      
#include
      
      
       
       
using namespace std;
char a[200];
char b[20]="anniversary";
int l,flag;
int dfs(int tep,int k,int i,int dep)//tep层  k是a串 i是b串 dep
{
    //printf("%d %d %d %d\n",tep,k,i,dep);
    if(tep>=3||i>l) return 0;
    if(k==11) {flag=1;return 1;}
    if(flag==1) return 1;
    if(a[i]==b[k])
    {
        dfs(tep,k+1,i+1,dep+1);
        dfs(tep,k,i+1,dep);
    }
    else
    {
        if(dep>0)   {dep=0;dfs(tep+1,k,i+1,dep);}
        else    dfs(tep,k,i+1,dep);
    }

}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s",a);
        l=strlen(a);
        flag=0;
        if(l<11)
        {
            puts("NO");
            continue;
        }

        if(dfs(0,0,0,0)==1) puts("YES");
        else puts("NO");
    }
    return 0;
}
      
      
     
     
    
    


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值