[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 ...
随机推荐
- Java设计模式——工厂模式
一.工厂模式分类 工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类: (1)简单工厂模式(Simp ...
- Python time()方法
from:http://www.runoob.com/python/att-time-time.html 描述 Python time time() 返回当前时间的时间戳(1970纪元后经过的浮点秒数 ...
- 【驱动】USB驱动实例·串口驱动·键盘驱动【转】
转自:http://www.cnblogs.com/lcw/p/3159370.html Preface USB体系支持多种类型的设备. 在 Linux内核,所有的USB设备都使用 usb_drive ...
- plupload 上传组件的使用
在这之前在感谢园子好多大牛的文章,在这里就不列出来了. 进入正题. svn检索https://github.com/moxiecode/plupload 获取到代码,这篇文章使用的是v2.1.8 主要 ...
- Java关于网络编程回顾
一.Java网络编程三要素:1.IP地址:是要确定发送的地址,IP地址一般分为5类. 2.端口:要确定发送的程序是哪一个,端口的范围是0--65535,其中0-1024是系统使用或保留端口 3.协议: ...
- 如何在线预览github上的html页面?
可以通过http://htmlpreview.github.io/这个网站,直接在线预览html页面. ↓ ↓ 可以发现:这个网站直接将github上的页面地址当做参数来传递.
- js权威指南---学习笔记02
1.JS只有函数作用域,没有块级作用域这个概念: 它有一个特性——声明提前:在同一个函数中不同位置声明的变量,都被提前在函数开始的时候,执行声明操作:在原先位置执行赋值操作: 2.声明的全局变量,相当 ...
- JAVA随笔(二)
在函数传参时,double传给int是不行的,反过来可以.参数只能传值.当参数是字符串时,传递的只是串值:但对于数组来说,传递的是管理权,也就是指针 对象变量是对象管理者. cast转型:基本类型与对 ...
- POJ 3286 How many 0's(数位DP模板)
题目链接:http://poj.org/problem?id=3286 题目大意: 输入n,m,求[n,m]的所有数字中,0出现的总数是多少,前导零不算. 解题思路: 模板题,设dp[pos][num ...
- 最近公共祖先(LCA)模板
以下转自:https://www.cnblogs.com/JVxie/p/4854719.html 首先是最近公共祖先的概念(什么是最近公共祖先?): 在一棵没有环的树上,每个节点肯定有其父亲节点和祖 ...