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. SDOI 2018 round2游记

    Day 0 早上起来从北京到济南 住宿环境不错 不过比赛环境怎么这么low啊 而且我在最偏僻的考场中最偏僻的角落里 身边居然是个妹子?! Day1 7:40到的考试地点 发现诸位大佬已经打完板子了or ...

  2. Android中Button四种点击事件实现方式

    1.Xml添加监听属性,这里添加的doClick. <Button android:id="@+id/bt1" android:layout_width="wrap ...

  3. Css打造一个简单的静态七巧板

    偶然在微博上看到用css写一个七巧板,正好也有一些源代码,于是就试着敲了敲. 主要是利用了css3的transform,实现平移,旋转,变形,直接用看到的代码敲出来之后有些问题,因为宽度上下面绿色的三 ...

  4. 启动Mysql时,提示error 2002 的解决办法

    故障描述 启动时提示ERROR 2002(HY000) 启动服务时,提示the server quit without updating PID file. 解决方法一: 1.由于mysql是卸载后重 ...

  5. 【sqli-labs】 less38 GET -Stacked Query Injection -String based (GET型堆叠查询字符型注入)

    这个直接用union select就可以 http://192.168.136.128/sqli-labs-master/Less-38/?id=0' union select 1,2,3%23 看一 ...

  6. java将父类所有的属性COPY到子类中

    public class FatherToChildUtils { /* * 将父类所有的属性COPY到子类中. * 类定义中child一定要extends father: * 而且child和fat ...

  7. Python总结1

    时间:24日下午输入:input()输出:print()格式化输出通过某种占位符用于替换字符串中某个位置的字符.占位符:%s:可以替换任意类型%d:可以替换数字类型 需要掌握的#1.strip去左右两 ...

  8. 一键安装本地yum仓库脚本

    #!/bin/bash#By:zhaocheng#Date:2019-01-18#Version v1 [ -d /media/cdrom ] || mkdir /media/cdrom[ -d /m ...

  9. js数组操作find查找特定值结合es6特性

    js数组操作find查找特定值结合es6特性

  10. kmp板子

    kmp 容易理解板子 详情见知乎 算法思想 对模式串求PMT,但实际上nxt数组是PMT向前移动一位 nxt数组含义:记母串为m[],模式串为p[]; m[i]与p[j]比较失配,需要比较m[i]与p ...