SDNU 1022.成语接龙(DFS)

SDNU 1022.成语接龙

Time Limit: 1000 MS Memory Limit: 32768 KB
Total Submission(s): 71 Accepted Submission(s): 35

Description
成语接龙的的游戏大家都玩过,现在咱们换换玩法,玩个英文版的“成语接龙”,规则是已知n个单词,给出龙头字母,要求以这个字母开头的最长的“龙”(每个单词最多在“龙”中出现2次),在两个单词相连时,起重合的部分合为一部分,例如best和stabber,接成一条龙则变为bestabber,另外相邻的两部分不能存在包含关系,例如at 和 atside 间不能相连。

Input
输入的第一行为一个整数n (n<=20),表示单词个数,以下n 行每行有一个单词(长度不超过50),输入的最后一行为一个单个字符,表示“龙”开头的字母。此字母开头的“龙”一定存在.

Output
只需输出以此字母开头的最长的“龙”的长度

Sample Input
5
at
touch
cheat
choose
tact
a

Sample Output
23

典型的dfs题,还有对于字符串的处理,在碰到前缀后缀判断的时候,substr函数真的很好用,谁用谁知道。
值得注意的是对于前后缀的判断要从大向小判断。

仔细做还是很简单的,附上Ac代码:

#include<bits/stdc++.h>
using namespace std;

int maxn=0,n;
string a[30];
int pd[30]= {0};

void dfs(string b,int sum)
{
    maxn=max(maxn,sum);
    //cout<<sum<<' '<<b<<endl;
    for(int i=0; i<n; i++)
    {
        if(pd[i]<2)
        {
            int lena=a[i].length();
            int lenb=b.length();
            int minx=min(lena,lenb);
            for(int j=minx-1; j>=1; j--)
            {
                if(b.substr(lenb-j,lenb)==a[i].substr(0,j))
                {
                    int x=b.substr(lenb-j,lenb-1).length();
                    pd[i]++;
                    dfs(a[i],sum+lena-x);
                    pd[i]--;
                }
            }
        }

    }
}
int main()
{
    cin>>n;
    for(int i=0; i<n; i++)
        cin>>a[i];
    char s;
    cin>>s;
    for(int i=0; i<n; i++)
    {
        if(a[i][0]==s)
        {
            memset(pd,0,sizeof(pd));
            pd[i]++;
            dfs(a[i],a[i].length());
        }
    }
    cout<<maxn<<endl;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值