题目描述

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

输入格式

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

输出格式

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

输入输出样例

输入 #1复制

5
at
touch
cheat
choose
tact
a

输出 #1复制

23

说明/提示

样例解释:连成的“龙”为 atoucheatactactouchoose

n \le 20n≤20。

单词接龙(题解)———hyperbole_Q

基本思路是搜索。

处理的难点在于对重叠部分的处理。

单词的使用次数很好判断,开一个数组即可,和正常向dfs的vis数组差不多。

但对于重叠部分的处理,我想细说一下。

因为连接起来的单词要最长,所以对比是选择从上一个单词的末尾与当前单词的开头进行比对,如果发现不符那就不能匹配。

其他的代码解释都一一使用注释的方法给各位大神标出来了。如果我讲的不够细或者还有不足,请大神手下留情勿喷,栓Q了。

这里我使用一个check函数,用来比较两个串s和m的长度为k的接口能不能匹配。

判断方式有两种,第一种就是我用的这样按字符比较,如果发现某处不匹配立即返回false。还有一个方法是用string里面的substr,有兴趣的同学可以试一下,如果再继续拓展的话就大可不必了啊。

我们假设接口长度为k,串s的长度为lens,然后我们从0到k枚举,判断s[lens-k+i]是不是等于m[i]。

这个式子怎么来的呢?接口前面的串是s,后面的串是m,那么很显然,s串的接口最开始应该是lens-k处,然后在后面加上一个枚举的i就可以保证扫描到所有接口字符(我们的i是从0开始枚举的)。

还有一些细节问题。 如果我们在接龙的时候发现我们现在要接的龙还不如之前某一次接过的长,那么这个接龙方案肯定不是最优的,所以要舍去,这个正确性是显然的。

(想一下深搜时的遍历过程,这句话便不难理解)

使用我这个方法,可能有一个奇怪的想法有同学没想到,那就是在进行拼接操作时,要注意使用给定的串的副本(即复制一份原来的串)进行拼接处理。

这是因为,如果你把原串改变了,而且这个串还不是最优的,那就完了,回溯不回去了。

具体到操作上,首先,我们从1到n枚举每个短字符串,如果它已经被用了两次则continue,然后我们求出当前短串的长度,从1到这个长度枚举,枚举的是接口的长度(自然是接口越短融合串越长嘛) 然后执行拼接操作,记录一下最大长度,再加上回溯就好了。

拼接操作和check函数很像,具体到代码上大家就能看明白了。废话不多说,上代码,保证AC!!!(作者亲测)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#define maxn 100//根据题目要求自调,各大网站题目可能会稍有变动
using namespace std;
int n;
int ans = 0;//其实也不需要赋0,只是个人习惯而已
string word[maxn];//字符串数组,用来存储单词
string beginn;//用来存储开头字符
int used[maxn];//这个就是用来记录dfs时候每一个单词被使用了几次的数组
bool check(string s,string m,int k){//重点一,check函数判断接口可行性,k代表接口长度,以下同int lens = s.length();for (int i=0;i<k;i++){if(s[lens-k+i]!=m[i])//我讲过了return false;}return true;
}
void add(string &s,string m,int k){//拼接操作,因为要把m接到s上,所以对于s串不可以传参,因为我们要试图改变这个串int lenm = m.length();for (int i=k;i<lenm;i++) s+=m[i];//C++字符串类型特性操作,支持+=符号直接拼接
}
void dfs(string now){//这只是一个看似平淡无奇的dfsint x = now.length();ans = max(ans,x);//每次拼接之后更新一下答案for (int i=1;i<=n;i++){if (used[i]>=2)//如果有一个单词用完了,那这个单词就不能选了continue;int maxk = word[i].length();for (int j=1;j<=maxk;j++){//枚举接口长度if (check(now,word[i],j)){string temp = now;//重点二,使用字符串副本进行拼接add(temp,word[i],j);if (temp==now)//拼完之后如果发现长度没增加,也就是和原串一样,那这次拼接没有意义,剪掉continue;used[i]++;dfs(temp);used[i]--;//这只是一个看似平淡无奇的回溯}}}
}
int main(){cin >> n;for (int i=1;i<=n;i++)cin >> word[i];cin >> beginn;dfs(beginn);cout << ans << endl;return 0;
}

勿喷,作者只是一个小学生...

单词接龙c++题解,请勿抄袭相关推荐

  1. luogu P1019 单词接龙 题解

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

  2. 信息学奥赛一本通 1220:单词接龙 | 1913:【00NOIP普及组】单词接龙 | OpenJudge NOI 2.5 8783 | 洛谷 P1019 [NOIP2000 提高组] 单词接龙

    [题目链接] ybt 1220:单词接龙 ybt 1913:[00NOIP普及组]单词接龙 OpenJudge NOI 2.5 8783:单词接龙 洛谷 P1019 [NOIP2000 提高组] 单词 ...

  3. 信息学奥赛一本通(1220:单词接龙)

    1220:单词接龙 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 5368     通过数: 3159 [题目描述] 单词接龙是一个与我们经常玩的成语接龙相类似的 ...

  4. 2023新华为OD机试题 - 单词接龙(JavaScript) | 刷完必过

    华为Od必看博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单 华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典 华为OD机试 全流程解析+经验分享,题型分 ...

  5. 【搜索】NOIP2000 or 洛谷1019单词接龙

    题目链接:洛谷1019 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙"(每个单词都最多在 ...

  6. 【每日一算法】单词接龙

    微信改版,加星标不迷路! 每日一算法-单词接龙 给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度.转换需遵循如下规 ...

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

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

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

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

  9. 算法提高课-搜索-DFS之搜索顺序-AcWing 1117. 单词接龙:dfs

    题目分析 来源:acwing 分析:外部dfs,需要状态恢复. 字符串a的后k的字母 和字符串b的前k个字母是否相同,用substr函数判断:if(a.substr(a.size() - k, k) ...

最新文章

  1. 计算机中丢失 MSVCR100.dll
  2. Huggingface简介及BERT tansformer 开源
  3. 《漫画算法2》源码整理-6 两数之和 三数之和
  4. PMCAFF微分享 | 京东首席搜索专家,告诉你电商搜索你不得不知道的秘密
  5. 数据库 三范式最简单最易记的解释
  6. go的各种import
  7. 法国 计算机金融 大学,捷报|GPA3.0,计算机转申金融,斩获法国顶级商学院录取!...
  8. python 港股交易数据_GitHub - 116pythonZS/futuquant: 富途量化平台 API
  9. git和gitlab安装
  10. 【OpenCV 例程 200篇】98. 统计排序滤波器
  11. mysql的安装用于连接jsp_怎么用JSP连接安装在Linux上的MySQL
  12. Git 基础(九)—— Failed to push some refs to git
  13. TCxGrid 把列移上移下。
  14. WinEdt编译重新生成PDF以及找到模板tex对应的论文树形结构
  15. java string与byte互转
  16. 7.3 超标量流水线
  17. 阿里跟腾讯又㕛叒打起来了,这次是在东南亚
  18. windows 安装metis_Metis 5.1.0 安裝心得 in Win10
  19. GridView-adaper控件设置边框-边距-实现分割效果
  20. 高斯判别分析(GDA)公式推导

热门文章

  1. UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xb5 in position 0: invalid start
  2. 家卫士扫地机器人好吗_谁用过家卫士 S320扫地机器人,说说感受
  3. mac强制关机后悲剧了
  4. Buy and Resell HDU - 6438(补)更新贪心
  5. idea的几个好用快捷键、常用配置(包括git)、jdk和javaSE和javaEE、创建一个SE工程、debug、创建一个Web工程、打war包
  6. 拟一维喷管流动的数值解——亚声速-超声速等熵喷管流动的守恒型CFD解法(MacCormack方法)
  7. 华为云获TFC“年度最佳云服务商”金苹果奖
  8. CISP和等保什么区别?
  9. 存储容量单位GB GiB MB MiB
  10. 为啥将phpstudy打开,却访问不了rips