题目描述 Description

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

输入描述 Input Description

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

输出描述 Output Description

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

样例输入 Sample Input

5

at

touch

cheat

choose

tact

a

样例输出 Sample Output

23

数据范围及提示 Data Size & Hint

(连成的“龙”为atoucheatactactouchoose)

就从给定字母开始不断找能接在最后一个单词后面且使用次数小于两次的单词。

#include<iostream>
#include<cassert>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<string>
#include<iterator>
#include<cstdlib>
#include<vector>
#include<stack>
#include<map>
#include<set>
using namespace std;
#define rep(i,f,t) for(int i = (f),_end_=(t); i <= _end_; ++i)
#define rep2(i,f,t) for(int i = (f),_end_=(t); i < _end_; ++i)
#define dep(i,f,t) for(int i = (f),_end_=(t); i >= _end_; --i)
#define dep2(i,f,t) for(int i = (f),_end_=(t); i > _end_; --i)
#define clr(c, x) memset(c, x, sizeof(c) )
typedef long long int64;
const int INF = 0x5f5f5f5f;
const double eps = 1e-8;//*****************************************************string s[22];
int n;
int vis[22];
bool ok(const string &st, int i, int j)                  //判断单词st能否从i位置开始将第j个单词拼接上
{if(s[j].size() < st.size()-i)return false;for(int k = 0; i < st.size(); ++i, ++k){if(st[i] != s[j][k])return false;}return true;
}
int dfs(int t,int len)
{int ans = len;++vis[t];                               //单词使用次数rep(j,1,n){if(vis[j] >= 2)continue;int jian = 0;for(string::iterator i = s[t].end()-1; i != s[t].begin(); --i)               //尽量从单词尾部开始拼接{++jian;                      //与新单词重合的长度if(ok( s[t], i-s[t].begin() , j)){int tmp = dfs(j,len+s[j].size()-jian);ans = max(ans,tmp);                        //记录最大长度break;}}}--vis[t];                  //还原该单词使用次数return ans;
}
int solve(char c)
{int ans = 0;rep(i,1,n){if(s[i][0]==c){int tmp = dfs(i,s[i].size());ans = max(ans,tmp);}}return ans;
}
int main()
{cin>>n;rep(i,1,n)cin>>s[i];char c;cin>>c;int ans = solve(c);cout<<ans<<endl;return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://www.cnblogs.com/DSChan/p/4862013.html

codevs1018 单词接龙(DFS)相关推荐

  1. P1019 单词接龙 (DFS)

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

  2. NOIP2000单词接龙[DFS]

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

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

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

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

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

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

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

  6. [蓝桥杯][算法训练VIP]单词接龙(DFS+String)

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

  7. java:单词接龙(dfs)(重点看看:包括相同单词不包含,还有找到第一个相同的开头单词相同的字母,连接字符串重复部分删除)

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

  8. 【DFS+回溯+字符串】【洛谷P1019】【单词接龙】

    传送门 /*[DFS+回溯+字符串][洛谷P1019][单词接龙]https://www.luogu.com.cn/problem/P1019题意:给你很多个单词 一个开头首字母 每个单词至多用2次 ...

  9. 洛谷 [P1019 单词接龙] {搜索|DFS} 奋斗的珂珂~

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

最新文章

  1. linux能用airport吗_苹果下架最后两款 AirPort 产品,正式退出路由器市场
  2. 男生遇到漂亮MM就变傻
  3. MySQL-在线处理大表数据 在线修改大表的表结构
  4. 三种监控平台配置及其整合(cacti nagios ganglia)
  5. 极客班C++ STL(容器)第二周笔记
  6. spring学习记录(一)
  7. vector中resize和reserve接口的异同
  8. Matlab光滑曲线多项式拟合与样条曲线拟合的两个案例
  9. 获取目录-Winform
  10. 简单函数编写_strcpy、_stroverchg、_strcmp
  11. 变分模态分解(VMD)-Python代码
  12. 常用编程语言的介绍及特点
  13. QT遍历 Json 根节点
  14. 在linux系统上搭建测试环境
  15. php7 slowlog,php7: php-fpm seems busy提示
  16. SpringBoot微信小程序V3支付
  17. 魅蓝5s即将发布 真假快充15日揭晓答案
  18. RV1126RV1109 buildroot 增加QT程序
  19. 解决Windows环境下PHP连接MySQL很慢的问题
  20. 【飞行器】模拟四旋翼飞行器飞行含Matlab源码

热门文章

  1. Linux系统各文件、目录介绍
  2. 问题 G: 编写函数:数组的排序 (Append Code)
  3. np.where使用:根据条件生成新的数组
  4. Ansible(六)对目标主机进行磁盘分区,创建逻辑卷、格式化并挂载
  5. c++ error函数_Linux中create_elf_tables函数整型溢出漏洞分析(CVE201814634)
  6. DEX Integral 上线 11 小时锁仓价值接近 3 亿美元
  7. SAP License:SAP与中国电子技术标准化研究院开展交流活动
  8. SAP License:GR与IR
  9. NiosII软处理器快速入门- 10分钟学会NiosII(1)
  10. POJ - 3026(BFS+最小生成树.krustal)