单词接龙是一个与我们经常玩的成语接龙相类似的游戏。

现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”,每个单词最多被使用两次。

在两个单词相连时,其重合部分合为一部分,例如 beast 和 astonish ,如果接成一条龙则变为 beastonish。

我们可以任意选择重合部分的长度,但其长度必须大于等于1,且严格小于两个串的长度,例如 at 和 atide 间不能相连。
输入格式

输入的第一行为一个单独的整数
表示单词数,以下

行每行有一个单词(只含有大写或小写字母,长度不超过20),输入的最后一行为一个单个字符,表示“龙”开头的字母。

你可以假定以此字母开头的“龙”一定存在。
输出格式

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

输入样例:

5
at
touch
cheat
choose
tact
a

输出样例:

23

提示

连成的“龙”为 atoucheatactactouchoose。

#include <bits/stdc++.h>using namespace std;
const int N = 30;
int g[N][N];
string arr[N];
int st[N];
int n;
int res = 0;
string maxRes;
void dfs(string & s, int idx) {  //上一个的下标是// res = max(res, (int)s.length());if (s.length() > res) {res = s.length();maxRes = s;}for (int i = 0; i < n; ++ i) {if (g[idx][i] > 0 && st[i] > 0) {int k = g[idx][i];st[i] --;string t = s + arr[i].substr(k);dfs(t, i);st[i] ++;}}
}
int main() {// 数据读入cin >> n;for (int i = 0; i < n; ++ i) {cin >> arr[i];}string s;cin >> s;// 每个单词只能访问两次fill(st, st + N, 2);// 预处理for (int i = 0; i < n; ++ i) {for (int j = 0; j < n; ++ j) {string a = arr[i], b = arr[j];int la = a.length(), lb = b.length(), cnt = min(la, lb);for (int k = 1; k < cnt; ++ k) {    // 这里是小于,非常巧妙,解决了相同时,和包含时的问题string t1 = a.substr(la-k, k), t2 = b.substr(0, k);if (t1 == t2) {g[i][j] = k;break;}}}}for (int i = 0; i < n; ++ i) {if (arr[i][0] == s[0]) {st[i] --;dfs(arr[i], i); // 上一个单词是arr[i]st[i] ++;}}cout << res << endl;return 0;
}
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 22;
int n,cnt[N],ans = 0;
string w[N];
int dfs(int u){int res = 0;cnt[u]++;for(int i = 0;i < n;i++){if(cnt[i] >= 2) continue;int p = w[u].size() - 1,q = w[i].size() - 1;for(int j = 1;j <= p && j <= q;j++){if(w[u].substr(p-j + 1) == w[i].substr(0,j)){res = max(res,dfs(i) - j);break;}}}cnt[u]--;return res + w[u].size();
}
int main(){cin>>n;for(int i = 0;i < n;i++)    cin>>w[i];char c;cin>>c;for(int i = 0;i < n;i++){if(w[i][0] == c){ans = max(ans,dfs(i));}    }cout<<ans<<endl;return 0;
}

单词接龙acwing相关推荐

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

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

  2. AcWing 1117 单词接龙

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

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

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

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

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

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

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

  6. P1019 单词接龙 (DFS)

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

  7. 洛谷——P1019 单词接龙

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

  8. 洛谷 P1019 单词接龙

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

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

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

最新文章

  1. 《深入理解计算机系统》读书笔记七:浮点数表示
  2. RabbitMQ 和 Kafka 到底怎么选?
  3. 点击率预估算法:FM与FFM
  4. ubuntu100%快速安装搜狗输入法
  5. 【Go语言】集合与文件操作
  6. 自旋锁spin : spin_lock_irq , spin_lock_irqsave
  7. 怎样固定计算机画图曲线,如何在电脑上画出固定长度的线段
  8. Java 实现享元(Flyweight)模式
  9. 华为服务器麒麟系统,麒麟云服务器
  10. 启动Flume Agent出现“A fatal error occurred while running“解决方法
  11. t检验的显著性p值python_t检验中的t值和p值是什么关系_t检验和p值的关系
  12. donet使用linq
  13. win10中常用快捷键 (包括切换窗口、打开我的电脑等快捷键)
  14. 如何快速编写一个汇编软件
  15. 下一代半导体表面清洁技术
  16. eureka相同服务名注册多个不同服务
  17. 为什么自来水按立方米收费?
  18. FFmpeg 直播黑屏问题分析解决
  19. 计算机专业毕设评阅人评语,毕业论文评阅人评语模板
  20. python正弦函数拟合_python生成任意频率正弦波方式

热门文章

  1. 高效利用团购,方便隔离生活
  2. 8、go语言:测试与性能调优
  3. Python核心编程(第3版)第2章网络编程中关于tcp/udp服务器和客户端实现代码的运行出错的修正
  4. mysql错误:Subquery returns more than 1 row
  5. 程序设计文档编写_编写有效的设计系统文档的6个技巧
  6. 硬件工程师成长之路(3)——PCB设计
  7. 卷积神经网络(conv2d参数含义、卷积层、池化层)
  8. multisim中轻触开关在哪_轻触开关和自锁开关的主要区别在哪里?
  9. NBA+大数据,数字经济重塑体育帝国!
  10. 机房收费系统_刷卡充值功能的实现