NC16758 [NOIP2000]单词接龙
题目
题目描述
单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at和atide间不能相连。
输入描述
输入的第一行为一个单独的整数n(n ≤ 20)表示单词数,以下n行每行有一个单词,输入的最后一行为一个单个字符,表示“龙”开头的字母。你可以假定以此字母开头的“龙”一定存在.
输出描述
只需输出以此字母开头的最长的“龙”的长度
示例1
输入
5
at
touch
cheat
choose
tact
a
输出
23
说明
连成的“龙”为 atoucheatactactouchoose
题解
知识点:DFS。
先要预处理出单词之间互相能衔接的最短长度方便搜索,\(link[i][j]\) 表示第 \(i\) 个单词和第 \(j\) 个单词能衔接的最短长度,如果不能衔接则为 \(-1\) ,初始时用 \(0\) 表示可开始的单词;用 \(vis[i]\) 表示第 \(i\) 个单词用到几次,两次就不能再用。然后一个简单的搜索,每次更新最大值。
时间复杂度 \(O(?)\)
空间复杂度 \(O(n^2)\)
代码
#include <bits/stdc++.h>
using namespace std;
int n;
string words[27];
int link[27][27];///x,y单词的衔接长度
int vis[27];
int ans;
int check(int x, int y) {
for (int i = 1;i < min(words[x].size(), words[y].size());i++) {
bool ok = true;
for (int j = words[x].size() - i;j < words[x].size();j++)
ok &= words[x][j] == words[y][j - (words[x].size() - i)];
if (ok) return i;
}
return -1;
}
void dfs(int pos = 0, int sum = 0) {
ans = max(ans, sum);
for (int i = 1;i <= n;i++) {
if (vis[i] == 2 || !~link[pos][i]) continue;
vis[i]++;
dfs(i, sum + words[i].size() - link[pos][i]);
vis[i]--;
}
}
int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> n;
for (int i = 1;i <= n;i++) cin >> words[i];
cin >> words[0];
for (int i = 1;i <= n;i++)
for (int j = 1;j <= n;j++)
link[i][j] = check(i, j);
for (int i = 1;i <= n;i++) link[0][i] = words[0][0] == words[i][0] ? 0 : -1;
dfs();
cout << ans << '\n';
return 0;
}
NC16758 [NOIP2000]单词接龙的更多相关文章
- NOIP2000单词接龙[DFS]
题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...
- NOIP2000 单词接龙
题三. 单词接龙 (27分) 问题描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的 ...
- Noip2000 T3 单词接龙
题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...
- [NOIP2000] 提高组 洛谷P1019 单词接龙
题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...
- 洛谷——P1019 单词接龙(NOIP2000 T3)
https://www.luogu.org/problem/show?pid=1019#sub 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母, ...
- NOIP2000提高组 单词接龙
题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙"(每个单词都最多在"龙" ...
- 洛谷 P1019 单词接龙 Label:dfs
题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...
- 洛谷 P1019 单词接龙【经典DFS,温习搜索】
P1019 单词接龙 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在 ...
- [openjudge-搜索]单词接龙
题目描述 描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙"(每个单词都最多在"龙&q ...
- 洛谷P1019:单词接龙(DFS)
题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙"(每个单词都最多在"龙" ...
随机推荐
- Vue- 绑定的图片不显示
需要通过 require包裹 <template> <div> {{user.username}}: <img :src="user.avatar" ...
- TCP连接状态的多种判断方法
前言 在TCP网络编程模型中,无论是客户端还是服务端,在网络编程的过程中都需要判断连接的对方网络状态是否正常.在linux系统中,有很多种方式可以判断连接的对方网络是否已经断开. 通过错误码和信号 ...
- 海思Hi35xx 通过uboot查看flash指定地址的数据
前言 在实际应用中有遇到过设备放置一段时间后设备不能启动的问题,uboot 完全没有响应,类似于flash中的数据被擦洗掉一样. 网上有介绍说是nandflash 不稳定,高温或是静电会导致nan ...
- [转帖]PD 配置文件描述
https://docs.pingcap.com/zh/tidb/stable/pd-configuration-file PD 配置文件比命令行参数支持更多的选项.你可以在 conf/config. ...
- [转帖]PostgreSQL任意命令执行漏洞利用(CVE-2019-9193)
https://zhuanlan.zhihu.com/p/143443516 最近没事曰曰内网,偶然发现了一个使用空密码的pg(是的,连爆破都省了).用navicat连上去看了下几个库都是一些业务 ...
- 【转帖】SRE 高延迟问题的罪魁祸首 System.gc()
https://www.infoq.cn/article/lXTRgYb9ecVBu*72fT7O jstact -gccause pid 3000 30 01 案例一: 某日,支付平台的开发人员找到 ...
- Docker与虚拟化技术浅析第一弹之docker与Kubernetes
1 前言 Docker是一个开源的引擎,可以轻松地为任何应用创建一个轻量级的. 可移植的.自给自足的容器.开发者在笔记本电脑上编译测试通过的容器可以批量地在生产环境中部署,包括VMs (虚拟机).ba ...
- 【OpenAI】ChatGPT函数调用(Function Calling)实践
6月13日OpenAI在Chat Completions API中添加了新的函数调用(Function Calling)能力,帮助开发者通过API方式实现类似于ChatGPT插件的数据交互能力. 本文 ...
- Ant Design Vue中TreeSelect详解
<template> <a-tree-select v-model:value="value" style="width: 320px" :t ...
- vue中v-model修饰符的使用和组件使用v-model
1.lazy 修饰器 lazy修饰器在input框中的表现效果是: 当你失去焦点后值才会跟新. 它的跟新时机是失去焦点后 这个修饰器在项目中运用的场景较少 <template> <d ...