题目描述

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

输入格式

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

输出格式

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

输入输出样例

输入
5
at
touch
cheat
choose
tact
a
输出
23

说明/提示

(连成的“龙”为atoucheatactactouchoose)

NOIp2000提高组第三题

完整代码

#include<bits/stdc++.h>
using namespace std;
int lens[30][30];//lens[i][j]代表第i个字符串与第j个字符串之间最长的公共长度
int sum[30];
char a[30][100];
int m;//代表字符串个数
char start;//代表“龙”开始的第一个字母
int ans;
//std::ios::sync_with_stdio(false)省略cin输入的时间
//深度优先搜索 int check(int x,int y)//使得y接在x的后面
{int len1=strlen(a[x]);int len2=strlen(a[y]);for(int k=1;k<min(len1,len2);k++)//不取等于就保证了不是子集 {int i=len1-k,j=0;//从0下标开始是字符串的输入 bool flag=true;while(i<len1&&j<k)//输入的时候下标均是从0开始的 {if(a[x][i]!=a[y][j])//如果出现不相等,说明该k值不是他的公共长度 {flag=false;break;}i++,j++; //继续判断 } if(flag){return k;//返回公共长度部分 } }return 0;//没有公共长度就返回0
}void dfs(int index,int len)
{ans=max(ans,len);for(int i=1;i<=m;i++){if(sum[i]>1) continue;//如果使用次数大于2,就直接不判断 if(lens[index][i]==0) continue;//如果没有公共部分,就直接不判断 sum[i]++;//使用次数加1 dfs(i,len+strlen(a[i])-lens[index][i]);sum[i]--;//恢复状态 }
}int main()
{scanf("%d",&m);std::ios::sync_with_stdio(false);for(int i=1;i<=m;i++){cin>>a[i];} cin>>start;//!!!不用%c因为之前可能有好多回车,使用cin忽略所有回车 for(int i=1;i<=m;i++){for(int j=1;j<=m;j++){lens[i][j]=check(i,j);}} for(int i=1;i<=m;i++){if(a[i][0]==start)//如果首字母等于给出的字母,就进行深度优先搜索 {sum[i]++;dfs(i,strlen(a[i]));sum[i]--;}}printf("%d\n",ans);return 0;
}

洛谷 [P1019 单词接龙] {搜索|DFS} 奋斗的珂珂~相关推荐

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

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

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

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

  3. 洛谷P1019 单词接龙

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

  4. 洛谷——P1019 单词接龙

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

  5. 洛谷 P1019 单词接龙

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

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

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

  7. luogu P1019 单词接龙 题解

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

  8. 深度优先搜索——单词接龙(洛谷 P1019)

    题目选自洛谷P1019 首先在题意上可能有些误解. 两个单词合并时,合并部分取的是最小重叠部分 相邻的两部分不能存在包含关系就是说如果存在包含关系,就不能标记为使用过. 每个单词最多出现两次. (其实 ...

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

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

最新文章

  1. Python面试必备—分布式爬虫scrapy+redis解析
  2. 通用权限管理系统组件 中集成多个子系统的单点登录(网站入口方式)附源码
  3. 网页设计千千万,网站建设万万千
  4. 关于DiscuzNT 1.0
  5. ICallbackEventHandler使用
  6. python异常处理时所使用的保留字_Python中,下列哪个保留字不用于异常处理______________。_学小易找答案...
  7. docker启动报错  (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 9876 -j DNAT --
  8. Exynos4412 裸机开发—— 流水灯
  9. 上海一公司向苹果索赔100亿,要求停售iPhone
  10. 新媒体营销操作手法及案例分享-初贵民
  11. 曲线运动与万有引力公式_专题三曲线运动与万有引力定律
  12. 51单片机仿真——蜂鸣器
  13. SpringBoot PageOffice 在线编辑 (完整版、有源码)
  14. 信息孤岛的形成与治理
  15. 快速爬取链家网的房源信息
  16. Codeforces Raif Round 1 (Div. 1 + Div. 2) 1428D Bouncing Boomerangs 贪心+构造
  17. 试卷模板 html,一年级语文试卷模板
  18. 5-1 决策树的模型
  19. Hive 优化--SQL执行顺序、Hive参数、数据倾斜 、小文件优化
  20. c语言程序设计教程高佳琴主编答案,数据结构与算法应用教程.ppt

热门文章

  1. ViewModel 源码解析
  2. xshell如何修改服务器的dns,xshell上服务器配置dns
  3. 物品分类游戏html5,辐射4图标物品分类mod
  4. pl sq能导入mysql么_用plsql导入数据库
  5. 神秘网络蠕虫出现,感染数万设备却不搞破坏,反而对抗其他木马
  6. 2020年北邮计算机专业分数线,2020北京邮电大学研究生分数线一览表(含2018-2019历年复试)...
  7. 爬虫-Scrapy (十) 搭建ip代理池
  8. 整个过程复制粘贴,在家做情感、励志短视频每月收益有7000多
  9. 将邮件模板内容拷贝到邮箱中(含样式)
  10. 【Vue 公众号网页设置全局背景音乐】