题目描述

单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如 beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at和 atide 间不能相连。

输入输出格式

输入格式:

输入的第一行为一个单独的整数n(n≤20)表示单词数,以下n 行每行有一个单词,输入的最后一行为一个单个字符,表示“龙”开头的字母。你可以假定以此字母开头的“龙”一定存在.

输出格式:

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

分析

本题还是一道dfs问题 重要的是如何处理给出的单词 以及如何构建一个dfs

首先我们注意到,想要找到最长的“龙”,根据贪心的原则,重合部分要取最小 比如 asdd 和ddas 这两个“单词”,合起来就是adddas 也就是只重合一个字母 而不是asddas 这一点是需要注意的

首先为了dfs的方便 我们可以构造一个数组 p[i][j] 代表 i 单词在前 j 单词在后的时候会重合多少字母 还是asdd和ddas的例子 如果i 单词是asdd,j 单词是ddas 那么p[i][j]=1,p[j][i]=2

至于构造的方式 看下面的代码就好了 注意一定是最小的重合部分。

代码:

#include<bits/stdc++.h>

using namespace std;

string s[];
char d;
int n,vis[],p[][],ans=-,an=; void ff(int x,int y)
{
int k,kx;
int ky=;
int flag=;
for(k=s[x].size()-;k>=;k--)
{
for(kx=k;kx<=s[x].size()-;kx++)
{
if(s[x][kx]!=s[y][ky++])
{
flag=;
break;
}
}
if(flag) //只要有重合部分就跳出,这样保证了重合的是最小的
{
p[x][y]=s[x].size()-k;
return;
}
ky=;
flag=;
}
return ;
} void dfs(int x)
{
int i,flag=;
for(i=;i<n;i++)
if(vis[i]<&&p[x][i]!=&&s[x].size()!=p[x][i]&&s[i].size()!=p[x][i])
{
flag=;
an+=s[i].size()-p[x][i];
vis[i]++;
dfs(i);
vis[i]--;
an-=s[i].size()-p[x][i];
}
if(!flag) //如果没有新的单词可以“接龙”,判断是否是更长的“龙”并返回
ans=max(ans,an);
return;
} int main()
{
int i,j;
cin>>n;
for(i=;i<n;i++)
{
cin>>s[i];
}
for(i=;i<n;i++)
for(j=;j<n;j++)
{
ff(i,j);
}
cin>>d;
for(i=;i<n;i++)
{
if(s[i][]==d)
{
vis[i]++;
an=s[i].size(); //不要忘了这一句 而且是 = 不是+=!!
dfs(i);
vis[i]=;
}
}
cout<<ans;
}

洛谷 p1019 单词接龙的更多相关文章

  1. 洛谷 P1019 单词接龙【经典DFS,温习搜索】

    P1019 单词接龙 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在 ...

  2. 洛谷 P1019 单词接龙 (DFS)

    题目传送门 当时一看到这题,蒟蒻的我还以为是DP,结果发现标签是搜索-- 这道题的难点在于思路和预处理,真正的搜索实现起来并不难.我们可以用一个贪心的思路,开一个dic数组记录每个单词的最小重复部分, ...

  3. 洛谷 P1019 单词接龙 Label:dfs

    题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...

  4. [NOIP2000] 提高组 洛谷P1019 单词接龙

    题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...

  5. 洛谷——P1019 单词接龙(NOIP2000 T3)

    https://www.luogu.org/problem/show?pid=1019#sub 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母, ...

  6. 洛谷P1019——单词接龙(DFS暴力搜索)

    https://www.luogu.org/problem/show?pid=1019#sub 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母, ...

  7. 洛谷P1019 单词接龙题解(超详细注释)

    https://www.luogu.org/problem/P1019 #include<cstdio> #include<cstring> #include<iostr ...

  8. 洛谷 P1019单词接龙

    看吧,多简单啊,没有人受伤的世界完成了.                                                                                ...

  9. 洛谷1019 单词接龙 字符串dfs

    问题描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...

随机推荐

  1. list.remove操作注意点

    通过源码分析一下结果public class Test { public static void main(String[] args) { // test1(); // test2(); test3 ...

  2. Linux中断管理 (3)workqueue工作队列

    目录: <Linux中断管理> <Linux中断管理 (1)Linux中断管理机制> <Linux中断管理 (2)软中断和tasklet> <Linux中断管 ...

  3. 【LeetCode-数组篇】 1 Two Sum

    1 前言 之所以开始刷 LeetCode 上的算法题,一是快面临秋招,第二点是因为提升自己的编程能力,坚持两个月,希望博友们监督. 这个系列打算用 C# 和 Java 编程,为什么用两门语言,因为经历 ...

  4. logstash grok内置规则

    logstash grok 内置正则 https://github.com/elastic/logstash/blob/v1.4.2/patterns/grok-patterns USERNAME [ ...

  5. ARC 066D Xor Sum AtCoder - 2272 (打表找规律)

    Problem Statement You are given a positive integer N. Find the number of the pairs of integers u and ...

  6. js总结:JavaScript入门

    1. JavaScript-输出内容(document.write) 2.在html中引用js文件 3.定义变量 语法:var 变量名 说明: ⑴变量必须使用字母.下划线(_)或者美元符($)开始. ...

  7. MySQL导出数据,并转存到Excel表格中

    从数据库中导出数据的方法,这里就不提了,网上有很多方法,如果闲麻烦,可以看一下这个:mysql导出数据 其实使用最简单的下面这个语句: mysql > select * from demo in ...

  8. mongoDB 安装和配置环境变量,超详细版本

    下载mongoDB进行安装:https://www.mongodb.com/                                                 到Community Se ...

  9. Oracle SQL优化原则

    原文:http://bbs.landingbj.com/t-0-240353-1.html 1.选用适合的 ORACLE 优化器 2.访问 Table 的方式 3.共享SQL语句 共享的语句必须满足三 ...

  10. 便捷的ajax请求

    为什么要做这个呢?如果后端给的数据不单有JSON字符串,还有对象呢?这个时候我们就要每个都处理(JSON.parse).万一后端又改了,所有都是对象呢?如此一来我们就需要对我们的ajax进行封装. 这 ...