[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 ...
随机推荐
- JS函数的几种用法
1.正常使用:
- 冲量:momentum
参见:http://www.jianshu.com/p/58b3fe300ecb,这个博客里有冲量的python实现的代码和讲解 “冲量”这个概念源自于物理中的力学,表示力对时间的积累效应. 在普通的 ...
- Linux内核抢占实现机制分析【转】
Linux内核抢占实现机制分析 转自:http://blog.chinaunix.net/uid-24227137-id-3050754.html [摘要]本文详解了Linux内核抢占实现机制.首先介 ...
- MySQL5.7之多源复制&Nginx中间件(上)【转】
有生之年系列----MySQL5.7之多源复制&Nginx中间件(上)-wangwenan6-ITPUB博客http://blog.itpub.net/29510932/viewspace-1 ...
- ETL利器Kettle实战应用解析系列二
本系列文章主要索引如下: 一.ETL利器Kettle实战应用解析系列一[Kettle使用介绍] 二.ETL利器Kettle实战应用解析系列二 [应用场景和实战DEMO下载] 三.ETL利器Kettle ...
- js对金额浮点数运算精度的处理方案
浮点数产生的原因 浮点数转二进制,会出现无限循环数,计算机又对无限循环小数进行舍入处理 js弱语言的解决方案 方法一: 指定要保留的小数位数(0.1+0.2).toFixed(1) = 0.3;这个方 ...
- 关于vc++ 6.0 编译器,点打开文件时自动关闭
装好VC++ 6.0后,点打开文件时编译器会自动关闭掉,然后在网上找到各位大神写的资料,果然是因为之前有安装vs2010冲突的缘故,然后http://download.csdn.net/source/ ...
- java基础31 List集合下的Vector集合
单例集合体系: ---------| collection 单例集合的根接口--------------| List 如果实现了list接口的集合类,具备的特点:有序,可重复 注:集合 ...
- [扩展推荐] Laravel 中利用 GeoIP 获取用户地理位置信息
我最近需要一个用户地域检测来设置用户的默认区域和货币.由 Daniel Stainback 创建的 torann/geoip 很好地满足为Laravel 5 项目提供 GeoIP 服务的要求. 这个 ...
- 关于SQLserver的索引的一些脚本
--判断无用的索引: SELECT TOP 30 DB_NAME() AS DatabaseName , '[' + SCHEMA_NAME(o.Schema_ID) + ']' + '.' + '[ ...