洛谷 P1127 词链——题解

news/2024/11/16 17:41:25/文章来源:https://www.cnblogs.com/qc0817/p/18352038

洛谷P1127题解


传送锚点


摸鱼环节

词链

题目描述

如果单词 \(X\) 的末字母与单词 \(Y\) 的首字母相同,则 \(X\)\(Y\) 可以相连成 \(X.Y\)。(注意:\(X\)\(Y\) 之间是英文的句号 .)。例如,单词 dog 与单词 gopher,则 doggopher 可以相连成 dog.gopher

另外还有一些例子:

  • dog.gopher
  • gopher.rat
  • rat.tiger
  • aloha.aloha
  • arachnid.dog

连接成的词可以与其他单词相连,组成更长的词链,例如:

aloha.arachnid.dog.gopher.rat.tiger

注意到,. 两边的字母一定是相同的。

现在给你一些单词,请你找到字典序最小的词链,使得每个单词在词链中出现且仅出现一次。注意,相同的单词若出现了 \(k\) 次就需要输出 \(k\) 次。

输入格式

第一行是一个正整数 \(n\)\(1 \le n \le 1000\)),代表单词数量。

接下来共有 \(n\) 行,每行是一个由 \(1\)\(20\) 个小写字母组成的单词。

输出格式

只有一行,表示组成字典序最小的词链,若不存在则只输出三个星号 ***

样例 #1

样例输入 #1

6
aloha
arachnid
dog
gopher
rat
tiger

样例输出 #1

aloha.arachnid.dog.gopher.rat.tiger

提示

  • 对于 \(40\%\) 的数据,有 \(n \leq 10\)
  • 对于 \(100\%\) 的数据,有 \(n \leq 1000\)

最爱水题解的我又来蟹题解了,这道词链题生动形象的为我们展现了蓝水题的强度,于是这道图论题就被我们干掉了。


正片开始

观察到数据范围很小,说明能给暴力的空间比较充裕,但纯暴力肯定会挂。


1.考虑暴力

暴力的话,直接建立邻接表,将字符串\(a[i]\)数组进行排序后枚举每个点暴搜一下,这里展示搜索代码。

code:

void dfs(int u,string s,int cnt)//u当前遍历点的标号,s为答案,cnt为加入字符串的数量
{if(cnt==n)//递归出口{s[s.length()-1]=' ';cout<<s;exit(0);}for(auto v:g[u])//遍历邻接表{if(vis[v]==0){vis[v]=1;dfs(v,s+a[v]+'.',cnt+1);vis[v]=0;}}
}

2.优化部分

我们从样例中可以发现,对于一条合法的答案,其一定为欧拉通路或欧拉回路。

一个点如果能作为起点,那其在字符串首出现次数一定比在字符串尾出现的次数多一,这样就可以对枚举起点处进行优化。

同时需特判回路的特殊情况。

code:

for(int i=1;i<=n;i++)
{in[a[i][0]]++;out[a[i][a[i].length()-1]]++;
}//统计每个字母作为首或尾出现的次数
for(int i=1;i<=n;i++)
{if(in[a[i][0]]==out[a[i][0]]+1)//满足条件才进入答案处理{vis[i]=1;dfs(i,a[i]+'.',1);vis[i]=0;}
}
vis[1]=1;
dfs(1,a[1]+'.',1);//特判欧拉回路
vis[1]=0;
cout<<"***"<<endl;//无解

完整代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e4+10;
int n,vis[N],in[N],out[N];
string a[N];
vector<int>g[N];
void dfs(int u,string s,int cnt)
{if(cnt==n){s[s.length()-1]=' ';cout<<s;exit(0);}for(auto v:g[u]){if(vis[v]==0){vis[v]=1;dfs(v,s+a[v]+'.',cnt+1);vis[v]=0;}}
}
int main()
{cin>>n;for(int i=1;i<=n;i++)cin>>a[i];sort(a+1,a+n+1);for(int i=1;i<=n;i++){in[a[i][0]]++;out[a[i][a[i].length()-1]]++;}for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(i!=j&&a[i][a[i].length()-1]==a[j][0]) g[i].push_back(j);for(int i=1;i<=n;i++){if(in[a[i][0]]==out[a[i][0]]+1){vis[i]=1;dfs(i,a[i]+'.',1);vis[i]=0;}}vis[1]=1;dfs(1,a[1]+'.',1);vis[1]=0;cout<<"***"<<endl;return 0;
}

完结收工!!!!!

个人主页

看完点赞,养成习惯

\(\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/780775.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

引领敏捷潮流:首届中国Scrum大会即将揭幕

中国「首届Scrum大会」将于2024年8月17日在上海大华虹桥假日酒店盛大召开。在全球数字化转型的浪潮中,敏捷已成为企业脱颖而出的关键。本次大会汇聚了Scrum领域的顶尖专家、实践者及企业领袖,共同探讨AI时代下的敏捷(Agile in the AI Age),深入探索智能时代的敏捷路径,掌…

解锁数学之美:VuePress博客如何优雅地呈现复杂公式

聊聊如何让 VuePress 显示数学公式块。聊聊如何让 VuePress 显示数学公式块。 ‍ 什么是数学公式块 如果你还不了解,可以先看看我的 Markdown 教程——Markdown 与数学公式。 ‍ ‍ 安装依赖 相关插件有很多,我这里选择的是 markdown-it-mathjax3​: npm i markdown-it-math…

【攻防】一个关于内网渗透过程的小技巧

在我们打攻防进行内网渗透的过程中,很多时候需要去收集内网的密码字典再对内网主机进行批量的密码喷洒。 这里密码获取的手段有很多,例如: 1、mimikatz抓取入口主机密码 2、翻查入口主机中关于密码的文件(例如数据库密码) 3、web系统的密码 4、自己构造目标的密码字典(xx…

matlab求解线性规划问题

在人们的生产实践中,经常会遇到如何利用现有资源来安排生产,以取得最大经济效益的问题。此类问题构成了运筹学的一个重要分支--数学规划,而线性规划(LinearProgramming,LP)则是数学规划的一个重要分支。本章会介绍线性规划模型与matlab求解 目录一、线性规划的标准形二、linpro…

snap和apt的区别简单了解[]

Linux中没有tree命令的时候提示安装的时候出现了两个命令,简单看了看两者有何区别(一般用apt就可以了): sudo snap install tree 和 sudo apt install tree 这两个命令都是用来安装 tree 命令行工具的,但它们使用的是不同的包管理器和软件源。Snapsnap 是由 Canonical 开…

Cisco ASAv 9.20.3 - 思科自适应安全虚拟设备 (ASAv)

Cisco ASAv 9.20.3 - 思科自适应安全虚拟设备 (ASAv)Cisco ASAv 9.20.3 - 思科自适应安全虚拟设备 (ASAv) Cisco Adaptive Security Virtual Appliance (ASAv) 请访问原文链接:https://sysin.org/blog/cisco-asav/,查看最新版。原创作品,转载请保留出处。 思科自适应安全虚拟…

字符串 md5在线生成的小工具

经常会找到md5字符串,然后需要一个在线工具:https://coding.tools/cn/md5道法自然

使用 defineNuxtRouteMiddleware 创建路由中间件

title: 使用 defineNuxtRouteMiddleware 创建路由中间件 date: 2024/8/10 updated: 2024/8/10 author: cmdragon excerpt: 本篇文章介绍了如何使用 defineNuxtRouteMiddleware 创建和应用路由中间件。通过示例演示了如何处理错误页面和身份验证逻辑。随着对 Nuxt.js 中间件的…

Spring AI 更新:支持OpenAI的结构化输出,增强对JSON响应的支持

就在昨晚,Spring AI发了个比较重要的更新。由于最近OpenAI推出了结构化输出的功能,可确保 AI 生成的响应严格遵守预定义的 JSON 模式。此功能显着提高了人工智能生成内容在现实应用中的可靠性和可用性。Spring AI 紧随其后,现在也可以对OpenAI的结构化输出完美支持了。 下图…

CryptoHouse:由 ClickHouse 和 Goldsky 支持的免费区块链分析服务(ClickHouse 博客)

我们很高兴地宣布 CryptoHouse,在 crypto.clickhouse.com 上可访问,这是一个由 ClickHouse 提供支持的免费区块链分析服务。https://crypto.clickhouse.com/现有的公共区块链分析服务通常需要定时、异步查询,而 ClickHouse 提供实时分析,通过即时查询响应来普及访问权限。用…