[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分) 问题描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的 ...
随机推荐
- Python类和实例方法和属性的动态绑定
python中实例创建后可以给实例绑定任何属性和方法 class Student(object): pass 给实例绑定一个属性: s=Student() s.name='Michel' print ...
- TeamViewer 版本v13.2.26558 修改ID
TeamViewer 使用频繁后会被判定为商业用途,不可用.此软件的账号和设备mac地址绑定. 修改TeamViewer ID后可以重新开始使用.下述方法可以成功修改TeamViewer ID. Wi ...
- 高并发分布式系统中生成全局唯一(订单号)Id
1.GUID数据因毫无规律可言造成索引效率低下,影响了系统的性能,那么通过组合的方式,保留GUID的10个字节,用另6个字节表示GUID生成的时间(DateTime),这样我们将时间信息与GUID组合 ...
- Golang 笔记 5 go语句
Go语句和通道类型是Go语言的并发编程理念的最终体现.与defer语句相同,go语句也可以携带一个表达式语句.Go语句的执行会很快结束,并不会对当前流程的进行造成阻塞或明显的延迟.一个简单的示例: ...
- 【腾讯云的1001种玩法】几种在腾讯云建立WordPress的方法(Linux)(二)
版权声明:本文由张宁原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/126547001488207964 来源:腾云阁 ht ...
- 【CF446D】DZY Loves Games 高斯消元+矩阵乘法
[CF446D]DZY Loves Games 题意:一张n个点m条边的无向图,其中某些点是黑点,1号点一定不是黑点,n号点一定是黑点.问从1开始走,每次随机选择一个相邻的点走过去,经过恰好k个黑点到 ...
- Spark Streaming之dataset实例
Spark Streaming是核心Spark API的扩展,可实现实时数据流的可扩展,高吞吐量,容错流处理. bin/spark-submit --class Streaming /home/wx/ ...
- 前端页面展示MySQL数据并实现前后端互动
前端页面使用H-ui框架 后端使用flask框架 数据库使用mysql 连接数据库通过pymysql实现 前端代码如下 <html lang="en"> < ...
- oracle 自定义比较函数
1>自定义比较函数,targetVal的值为字符串,例如:“>=90”,"2~8"等范围格式,dataVal值为字符串. create or replace funct ...
- 半夜两点灵光一现想出来的一个demo
功能: 1.用户通过页面下载Excel模板,按照模板填写数据,上传Excel , 服务器解析 ,绘制成折线图.柱状图.雷达图 ....... 2.用户在线编辑数据,绘图 (没想好咋弄) 可定制需求,根 ...