[openjudge-搜索]单词接龙
题目描述
描述
单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如 beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at 和 atide 间不能相连。
输入输出格式
输入格式:
输入的第一行为一个单独的整数n (n<=20)表示单词数,以下n 行每行有一个单词,输入的最后一行为一个单个字符,表示“龙”开头的字母。你可以假定以此字母开头的“龙”一定存在.
输出格式:
只需输出以此字母开头的最长的“龙”的长度
输入输出样例
输入样例#1:
5
at
touch
cheat
choose
tact
a
输出样例#1:
23 (连成的“龙”为atoucheatactactouchoose)
说明
NOIP2000提高组第三题
NOIP2000普及组第四题
分析
总的来说,这道题虽说不难,却很“坑”。
思路
这是一道深搜题,我们先要确定两单词重合部分的“头”,可以采取将后一个字符串的第一个字符与前一个字符串的第i个字符(i=len-1;i>0;i–)需要注意是逆序查找(之后会解释)。因此可以得到前一个串的重合部分的开始位置,同时也要向后遍历一遍核对每一个字母都对应相同吗,我们就可以完全确定两个字符串是否能够相连,再将现在所连的总单词长度求出,进入下一轮搜索即可。
数据分析
对于前三个测试数据,关键是在理解在两个单词相连时,其重合部分合为一部分,例如 beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at 和 atide 间不能相连。这句话的含义,实际上,这种包含也有特殊情况例如样例#1:
1
envelope
e
对于这组数据,我们可以将envelope与envelope相连的情况的龙看作envelope,这是一种包含关系,是不可取的。但同时我们也可以将龙看作是e,是可取的。连接后的单词为envelopenvelope长度为15.那么,我们到底是以哪一种思考方向面对这个数据呢?题目的要求是求出以这个字母开头的最长的“龙”因此我们因该与最长的那一串即15为结果。从这三组数据就可以解释前面找两单词重合部分的“头”的逆序查找的原因了。
对于第四个测试数据,也是一个非常“经典”的坑,让我们看看这组数据吧:
样例#4:
8
no
new
name
never
national
necessary
ever
me
n
接来接去,有没有发现namever就是所有单词中唯一能够接上的一组。所以答案就是7了吗?然而事实并不是那么简单,再当我们仔细数数每个单词的时候,我们会发现necessary这个单词本来就比namever长!因此在写代码时必须要注意第一次找以字母n开头的单词时,也要将它与最大值比较。
数据5,6,没有坑点,故一笔略过。
代码实现
接下来就放代码了
#include<bits/stdc++.h>
using namespace std;
int n,j,ans,b[25],maxx,k;
string a[25],c[25];
char h,head;
void dfs(int m)
{
for(int i=1;i<=n;i++)
{
if(b[i]<2)
{
int q,p=c[m-1].length(),flag=1,fk=0;
for(int j=p;j>0;j--)
if(c[m-1][j]==a[i][0]){q=j;fk=1;break;}
if(fk)
{
for(int k=q+1;k<=p-1;k++)
if(c[m-1][k]!=a[i][k-q]){flag=0;break;}
if(flag&&p-q!=a[i].length())
{
ans+=(a[i].length()-(p-q));
c[m]=a[i];
maxx=max(maxx,ans);
b[i]++;
dfs(m+1);
ans-=(a[i].length()-(p-q));
b[i]--;
}
}
}
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)cin>>a[i];
getchar();
scanf("%c",&head);
for(int i=1;i<=n;i++)
{
ans=0;
if(head==a[i][0])
{
ans+=a[i].length();
maxx=max(maxx,ans);
c[1]=a[i];
b[i]++;
dfs(2);
b[i]--;
}
}
printf("%d",maxx);
}
[openjudge-搜索]单词接龙的更多相关文章
- 洛谷 P1019 单词接龙【经典DFS,温习搜索】
P1019 单词接龙 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在 ...
- 蓝桥杯 算法训练 单词接龙 _DFS_搜索 字符串比较
单词接龙 问题描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相 ...
- Leetcode之广度优先搜索(BFS)专题-127. 单词接龙(Word Ladder)
Leetcode之广度优先搜索(BFS)专题-127. 单词接龙(Word Ladder) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary Tre ...
- 洛谷P1019——单词接龙(DFS暴力搜索)
https://www.luogu.org/problem/show?pid=1019#sub 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母, ...
- ALGO-18_蓝桥杯_算法训练_单词接龙(搜索)
问题描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...
- 【搜索】P1019 单词接龙
题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...
- 【搜索】单词接龙 luogu-1019
题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙"(每个单词都最多在"龙" ...
- 洛谷 P1019 单词接龙 Label:dfs
题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...
- 【wikioi】1018 单词接龙
题目链接 算法:DFS+考你阅题 题目描述: 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中 ...
- NOIP2000 单词接龙
题三. 单词接龙 (27分) 问题描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的 ...
随机推荐
- Kubernetes集群部署之四Master节点部署
Kubernetes Master节点部署三个服务:kube-apiserver.kube-controller-manager.kube-scheduler和一个命令工具kubectl. Maste ...
- JavaScript之JS的数据类型
前言 JavaScript一共有6中数据类型: 基本数据类型(5):字符串(String).数字(Number).布尔(Boolean).数组(Array).空(Null).未定义(Undefined ...
- 最新最全的Java面试题整理(内附答案)
Java基础知识篇 面向对象和面向过程的区别 面向过程: 优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机.嵌入式开发.Linux/Unix等一般采用面向过程开发, ...
- js插件解读
1.calendar.js:日期插件:2.html5shiv.js:用于解决IE9以下版本浏览器对HTML5新增标签不识别,并导致CSS不起作用的问题的js文件:3.jquery.js里的代码是没有进 ...
- 几个常见的Mysql索引问题
1. 选择性较低的列是否适合加索引? 索引选择性等于列中不重复(distinct)的行数量(也叫基数),与记录总数的比值.范围在0-1之间.数值越大,索引越快. 例如主键是唯一的,不重复的,所以选择性 ...
- CentOS7 安装Python3,开发SocketIO 客户端
CentOS7安装Python3,开发SocketIO 客户端 参考:https://blog.csdn.net/lovefengruoqing/article/details/79284573 步骤 ...
- Oracle导出数据EXP00106错误
在导出dmp文件的时候(命令:exp 用户名/密码@IP/实例名 file=D:\20180910.dmp log=D:\20180910.log),遇到以下错误: 错误原因: 导出使用的是Orac ...
- Java字符串连接的多种实现方法及效率对比
JDK 1.8(Java 8)里新增String.join()方法用于字符串连接.本文基于<Java实现String.join()和效率比较>一文,分析和比较四种自定义实现与String. ...
- Jmeter中使用SSH插件,连接远程linux机器执行命令
一.Why 在云主机测试中,需要使用SSH协议连接云主机进行相关操作 在python中使用paramiko库很好实现,在如果要使用jmeter做性能测试时,怎么做? 二.解决 既然原生jmeter没有 ...
- Linux基本的命令使用2018-4-20 18:47:28
1.1ls -a 显式所有文件,包括隐藏文件 1.2 ls -l 列表形式显式文件名称 1.3 ls -l -h 列表显式大小和名称 也可以这样写 ls -alh (-可以省略) 重定向 ls ...