P1127 词链

题目描述

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

另外还有一些例子:

dog.gopher

gopher.rat

rat.tiger

aloha.aloha

arachnid.dog

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

aloha.arachnid.dog.gopher.rat.tiger

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

现在给你一些单词,请你找到字典序最小的词链,使得这些单词在词链中出现且仅出现一次。

输入输出格式

输入格式:

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

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

输出格式:

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

输入输出样例

输入样例#1:

6
aloha
arachnid
dog
gopher
rat
tiger
输出样例#1:

aloha.arachnid.dog.gopher.rat.tiger

说明

对于40%的数据,有n≤10;

对于100%的数据,有n≤1000。

这一题是典型的欧拉道路题目。  欧拉道路的定义是: 除了起点和终点外, 其他点的“进出” 次数应该相等。 换句话说,除了起点和终点外, 其他点的度数应该是偶数。

对于有向图, 则必须其中一个点的出度恰好比入度大1, 另一个的入度比出度大。

如果奇点数不存在的话, 则可以从任意点出发,最终一定会回到该点(成为欧拉回路)。

题目给的单词量比较大,但是有用的只有首和尾的字母,所以只需要存首尾字母就可以了。

欧拉道路还有关键的一部是判断这一个图是连通的, 并且只有一个一个连通分支。

这个可以用并查集的方法, 也可一用dfs直接搜索。

1.单词作点 可以拼在一起的单词连边。

2.先对单词排序,加边时注意顺序,使找到的第一个欧拉回路即为字典序最小的,后面直接跳出就好了。

3.dfs前初步判断一下是否有解(注意,是初步!!!) 用一些奇怪的方法

4.dfs后,若找到解则输出,否则***。(因为初步判断有解时可能将一些无解的情况放过了)

 #include <bits/stdc++.h>
using namespace std;
const int N=,inf=<<;
int n,len[N],sta[N],cnt[],top=;
int head[N],to[N*N],next1[N*N],en;
bool flag=false,vis[N];
string s[N];
void dfs(int u)
{
if (flag) return ;
sta[top++]=u;
vis[u]=true;
int v;
for (int i=head[u];i;i=next1[i])
{
v=to[i];
if (!vis[v]) dfs(v);
}
//如果链上了所有点,说明成功了
if (top==n) flag=true;
else vis[u]=false,--top;
}
//日常数组模拟链表,没毛病
void add_edge(int u,int v){
to[++en]=v,next1[en]=head[u],head[u]=en;
}
int main()
{
//读入数据
cin>>n;
for (int i=;i<=n;i++)
cin>>s[i];
//排序
sort(s+,s+n+);
//记录每个单词长度
for (int i=;i<=n;i++)
len[i]=s[i].size();
//头尾比较法寻找配对单词
for (int i=;i<=n;i++)
for (int j=n;j>=;j--)
//i单词的尾和j单词的头相同
//并且这两个单词不是同一个
if (i!=j && s[i][len[i]-]==s[j][])
//给所有配对的单词添加边
add_edge(i,j);
//统计每个字母的入度和出度情况(单词头尾的字母)
//因为欧拉图对节点出入度有要求
//欧拉道路的定义是: 除了起点和终点外, 其他点的“进出” 次数应该相等。 换句话说,除了起点和终点外, 其他点的度数应该是偶数。
//对于有向图, 则必须其中一个点的出度恰好比入度大1, 另一个的入度比出度大。
for (int i=;i<=n;i++)
cnt[s[i][]-'a']++,cnt[s[i][len[i]-]-'a']--;
int k=,h;
//初步统计是否符合欧拉图,不符合直接输出不可以
for (int i=;i<;i++){
if (cnt[i]==) k++,h=i;
if (cnt[i]==) k=;
if (k==) break;
}
//说明有两个入口
if (k==) cout<<"***\n";
//看看这个点是不是起点,因为只有起点才回没有单词的末尾匹配
else if (k==){
for (int i=;i<=n;i++)
if (s[i][]-'a'==h)
dfs(i);
}
else {
//k==0的情况,说明成环了
//取i节点做起始节点看是否成链
for (int i=;i<=n;i++)
dfs(i);
}
if (!flag) {
cout<<"***\n";
return ;
}
cout<<s[sta[]];
for (int i=;i<top;i++)
cout<<'.'<<s[sta[i]];
cout<<endl;
return ;
}

类似题目:

UVa10129

P1127 词链的更多相关文章

  1. 校内OJ 1128 词链(link)(Trie+DFS)

    1128: 词链(link) 时间限制: 1 Sec  内存限制: 64 MB 提交: 23  解决: 7 [提交][状态][讨论版] 题目描述 给定一个仅包含小写字母的英文单词表,其中每个单词最多包 ...

  2. 词链(link)

    词链(link) 题目描述 给定一个仅包含小写字母的英文单词表,其中每个单词最多包含50个字母.如果一张由一个词或多个词组成的表中,每个单词(除了最后一个)都是排在它后面的单词的前缀,则称此表为一个词 ...

  3. RQNOJ 429 词链:单调栈

    题目链接:https://www.rqnoj.cn/problem/429 题意: 如果一张由一个词或多个词组成的表中,每个单词(除了最后一个)都是排在它后面的单词的前缀,则称此表为一个词链. 如:i ...

  4. cogs 173. 词链 字典树模板

    173. 词链 ★★☆   输入文件:link.in   输出文件:link.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述]给定一个仅包含小写字母的英文单词表,其中每个 ...

  5. 53.FIB词链

    时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题解 题目描述 Description Fibonacci词定义如下:FIB1 = b  FIB2 = a 当k  ...

  6. 2021record

    2021-10-14 P2577 [ZJOI2004]午餐 2021-10-13 CF815C Karen and Supermarket(小小紫题,可笑可笑) P6748 『MdOI R3』Fall ...

  7. 洛谷P1127-词链

    Problem 洛谷P1127-词链 Accept: 256    Submit: 1.3kTime Limit: 1000 mSec    Memory Limit : 128MB Problem ...

  8. P1127

    题目描述 如果单词X的末字母与单词Y的首字母相同,则X与Y可以相连成X.Y.(注意:X.Y之间是英文的句号“.”).例如,单词dog与单词gopher,则dog与gopher可以相连成dog.goph ...

  9. tyvj1113 魔族密码

    描述     风之子刚走进他的考场,就……    花花:当当当当~~偶是魅力女皇——花花!!^^(华丽出场,礼炮,鲜花)    风之子:我呕……(杀死人的眼神)快说题目!否则……-_-###    花 ...

随机推荐

  1. electron 学习

    index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  2. WEB笔记-CSS 实现多级导航效果

    代码如下 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...

  3. VHDL之std_logic_1164

    This packages defines a standard for designers to use in describing the interconnection data types u ...

  4. 【Bootstrap】如何让响应式图片(img-responsive)水平居中

    我们在用bootstrap排版内容的时候,有的时候在内容中需要图片水平居中对齐. 一般情况下,我们的图片都使用了 .img-responsive 类来实现响应式图片.如果需要实现响应式图片水平居中,那 ...

  5. 用Python来实现斐波那契数列.

    1).递归 def fib_recur(n): assert n >= 0, "n > 0" if n <= 1: return n return fib_rec ...

  6. 团体程序设计天梯赛-练习集-L1-032. Left-pad

    L1-032. Left-pad 根据新浪微博上的消息,有一位开发者不满NPM(Node Package Manager)的做法,收回了自己的开源代码,其中包括一个叫left-pad的模块,就是这个模 ...

  7. C#调用存储过程中事务级临时表返回DataTable列乱序解决办法

    string result = strSqlResult.Substring(3).Trim().Replace("\n", "").Replace(" ...

  8. SUSE 11 SP3 搭建weblogic服务

    环境的搭建和业务需求相关,仅供参考 环境: SUSE 11 SP3 安装步骤 创建一个weblogic组 创建一个用户名为weblogic的用户, 创建相关目录 上传jdk,脚本等 安装 创建用户及其 ...

  9. python基础1 格式化输出

    转载自:https://www.cnblogs.com/fat39/p/7159881.html %用法 1.整数输出 %o —— oct 八进制%d —— dec 十进制%x —— hex 十六进制 ...

  10. 洛谷P1781 宇宙总统【排序+字符串】

    地球历公元6036年,全宇宙准备竞选一个最贤能的人当总统,共有n个非凡拔尖的人竞选总统,现在票数已经统计完毕,请你算出谁能够当上总统. 输入输出格式 输入格式: president.in 第一行为一个 ...