hdu 5311 Hidden String dfs(搜索)

Hidden String Accepts: 437 Submissions: 2174

这个好像是转载的,忘了原文地址了,改成原创了,有发现的可以提醒下

问题描述
今天是BestCoder一周年纪念日. 比赛管理员Soda有一个长度为nn的字符串ss. 他想要知道能否找到ss的三个互不相交的子串依次连接之后得到字符串"anniversary".
输入描述
输入有多组数据. 第一行有一个整数TT (1 \le T \le 100)(1≤T≤100), 表示测试数据组数. 然后对于每组数据:

一行包含一个仅含小写字母的字符串ss (1 \le |s| \le 100)(1≤∣s∣≤100).
输出描述
对于每组数据, 如果Soda可以找到这样三个子串, 输出"YES", 否则输出"NO".
输入样例
2
annivddfdersewwefary
nniversarya
输出样例
YES
NO

题目有点不清楚,想看的戳链接
http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=610&pid=1002

解题思路:
写了一下午,最后发现看错了题,题目问的是三个互不相交的子串,我错误理解成了三个子串必须中间隔着东西,也就是必须分开,但事实是不一定要分成三个部分,只要一个串能分成三部分就好了,也就是即使是一个串也可以,因为它也能分成三部分。
所以这道题我们需要的是找到小于等于三个串,使它们能拼成题目所需要的anniversary,然后用深搜,找到一个相符的串,就dfs一下,直到串结束。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
char a[]="anniversary",s[105];
int m,T,n;
bool mark;
bool dfs(int i,int j,int k)
{
    if(k<=3&&i>=m)
    {

        return true;
    }
    for(; j<n; j++)
    {
        if(k<=3&&i>=m) return true;
        if(k>3) return false;
        int i1=i;
        int j1=j;
        while(i1<m&&j1<n&&a[i1]==s[j1])
        {
            i1++;
            j1++;
        }
        if(i1>i&&dfs(i1,j1,k+1))
        {
            return true;
        }
    }
    return false;
}

int main()
{
    scanf("%d",&T);
    m=strlen(a);
    while(T--)
    {
        mark=false;
        scanf("%s",s);
        n=strlen(s);
        if(dfs(0,0,0)) printf("YES\n");
        else printf("NO\n");
    }
    return  0;
}

参考博客:http://www.bubuko.com/infodetail-998261.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值