[POJ2337]Catenyms
题目大意:
定义一个catenym是一对单词,满足第一个单词的末尾字符与第二个单词的开头字符相等。
定义复合catenym是一些单词,满足第i个单词的末尾字符与第i+1个单词的开头字符相等。
给你n个字符串,判断它们是否能构成复合catenym。
如果能,求出字典序最小的那个catenym。
思路:
以字母为点,单词为边建图。用类似Fleury算法,跑一边欧拉路径,如果能跑出欧拉路经则说明可以构成。
为了保证catenym的字典序最小,我们就要保证在Fleury的时候,按照字典序遍历。
因此我们要先对所有的单词按字典序排序,然后加边。
*/
#include<stack>
#include<string>
#include<vector>
#include<iostream>
#include<algorithm>
#include<functional>
const int N=,V=;
std::string s[N];
struct Edge {
int to,id;
bool vis;
};
std::vector<Edge> e[V];
inline void add_edge(const int &u,const int &v,const int &i) {
e[u].push_back((Edge){v,i,false});
}
inline int idx(const int &ch) {
return ch-'a';
}
bool vis[V];
int in[V],out[V];
std::stack<int> ans;
void dfs(const int &x) {
for(std::vector<Edge>::reverse_iterator i=e[x].rbegin();i!=e[x].rend();i++) {
if(i->vis) continue;
i->vis=true;
dfs(i->to);
ans.push(i->id);
}
}
inline void init() {
for(register int i=;i<V;i++) e[i].clear();
std::fill(&in[],&in[V],);
std::fill(&out[],&out[V],);
std::fill(&vis[],&vis[V],false);
while(!ans.empty()) ans.pop();
}
int main() {
std::ios_base::sync_with_stdio(false);
std::cin.tie(NULL);
register int T;
for(std::cin>>T;T;T--) {
init();
int n;
std::cin>>n;
for(register int i=;i<n;i++) {
std::cin>>s[i];
}
std::sort(&s[],&s[n],std::greater<std::string>());
int start=V;
for(register int i=;i<n;i++) {
const int &u=idx(*s[i].begin()),&v=idx(*--s[i].end());
out[u]++;
in[v]++;
add_edge(u,v,i);
start=std::min(start,std::min(u,v));
}
int cnts=,cntt=;
bool flag=false;
for(register int i=;i<V;i++) {
if(out[i]-in[i]==) {
cnts++;
start=i;
} else if(in[i]-out[i]==) {
cntt++;
} else if(in[i]!=out[i]){
flag=true;
}
}
if(flag||!((cnts==&&cntt==)||(cnts==&&cntt==))) {
std::cout<<"***"<<std::endl;
continue;
}
dfs(start);
if((signed)ans.size()!=n) {
std::cout<<"***"<<std::endl;
continue;
}
std::cout<<s[ans.top()];
ans.pop();
while(!ans.empty()) {
std::cout<<'.'<<s[ans.top()];
ans.pop();
}
std::cout<<std::endl;
}
return ;
}
[POJ2337]Catenyms的更多相关文章
- POJ2337 Catenyms(欧拉通路的求解)
Catenyms Time Limit: 1000MS Memory Limi ...
- Catenyms (POJ2337) 字典序最小欧拉路
// 很久不写图论,连模板也不熟悉了0.0 // 这题是一个技巧性比较高的暴力DFS Catenyms 题目大意 定义catenym为首尾字母相同的单词组成的单词对, 例如: dog.gopher g ...
- POJ 2337 Catenyms (有向图欧拉路径,求字典序最小的解)
Catenyms Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8756 Accepted: 2306 Descript ...
- poj2337 欧拉路径
poj2337 这道题昨天晚上开始做,今天才A.但是问题想透了, 发现其实没那么难 题目大意: 给你一些单词,如果一个单词的末尾字符与另一个单词首字符相同,则两个的单词可以连接.问是否可以把所有单词连 ...
- Catenyms
poj2337:http://poj.org/problem?id=2337 题意:给定一些单词,如果一个单词的尾字母与另一个的首字母相同则可以连接.问是否可以每个单词用一次,将所有单词连接,可以则输 ...
- poj2337欧拉回路要求输出路径
Catenyms Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8368 Ac ...
- POJ 2337 Catenyms (欧拉回路)
Catenyms Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8173 Accepted: 2149 Descript ...
- UVA 10441 - Catenyms(欧拉道路)
UVA 10441 - Catenyms 题目链接 题意:给定一些单词,求拼接起来,字典序最小的,注意这里的字典序为一个个单词比过去,并非一个个字母 思路:欧拉回路.利用并查集判联通,然后欧拉道路判定 ...
- Day 4 -E - Catenyms POJ - 2337
A catenym is a pair of words separated by a period such that the last letter of the first word is th ...
随机推荐
- 大数据系列之数据仓库Hive中分区Partition如何使用
Hive系列博文,持续更新~~~ 大数据系列之数据仓库Hive原理 大数据系列之数据仓库Hive安装 大数据系列之数据仓库Hive中分区Partition如何使用 大数据系列之数据仓库Hive命令使用 ...
- C 数据结构堆
引言 - 数据结构堆 堆结构都很耳熟, 从堆排序到优先级队列, 我们总会看见它的身影. 相关的资料太多了, 堆 - https://zh.wikipedia.org/wiki/%E5%A0%86%E7 ...
- 24 The Go image package go图片包:图片包的基本原理
The Go image package go图片包:图片包的基本原理 21 September 2011 Introduction The image and image/color packag ...
- drop out为什么能够防止过拟合
来源知乎: dropout 的过程好像很奇怪,为什么说它可以解决过拟合呢?(正则化) 取平均的作用: 先回到正常的模型(没有dropout),我们用相同的训练数据去训练5个不同的神经网络,一般会得到5 ...
- Elasticsearch5.0 安装问题
使用Elasticsearch5.0 必须安装jdk1.8 [elsearch@vm-mysteel-dc-search01 bin]$ java -version java version &quo ...
- 自定义Adapter为什么会重复多轮调用getView?——原来是ListView.onMeasure在作祟
相信很多人在使用自定义Adapter的时候都遇到这样的问题: 假设Adapter数据源中只有30个Item,理论上每显示一个新的Item的时候就会调用一次getView,均显示一次的话是要调用getV ...
- 【LOJ】 #2025. 「JLOI / SHOI2016」方
题解 有什么LNOI啊,最后都是JLOI罢了 一道非常--懵逼的统计题 当然是容斥,所有的方案 - 至少有一个点坏掉的正方形 + 至少有两个点坏掉的正方形 - 至少有三个点坏掉的正方形 + 至少有四个 ...
- UESTC - 594 我要长高
他们oj挂掉啦, 我先保存一下代码... 直接dp复杂度, n * 100 * 100, 我们可以将前一个人的信息丢进单调队列中去,可以优化成n * 100; #include<bits/std ...
- Ubuntu18.04 n卡配置
一.背景 最近安装了ubutnu18.04后,安装系统后重启卡住,强制关机重启后,又在开机界面紫屏卡住,上网搜索后发现是n卡的驱动问题,使用以下方法安装驱动后成功解决该问题. 二.解决方法 1.进入恢 ...
- think组合查询AND和OR一起用
如下示例: $_where 和 $where组合查询 $_where之间用OR $where之间用AND 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ...