[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 ...
随机推荐
- MySQL防范SQL注入风险
MySQL防范SQL注入风险 0.导读 在MySQL里,如何识别并且避免发生SQL注入风险 1.关于SQL注入 互联网很危险,信息及数据安全很重要,SQL注入是最常见的入侵手段之一,其技术门槛低.成本 ...
- 最长上升子序列O(nlogn) 要强的T^T(2358)
题目来源:http://www.fjutacm.com/Problem.jsp?pid=2358 要强的T^T TimeLimit:1000MS MemoryLimit:65536K 64-bit ...
- linux环境下mysql默认是区分表名大小写的
在linux环境下,mysql默认表明是区分大小写的,我们可以查看全局变量发现: mysql> show variables like 'lower%'; +------------------ ...
- 【Python项目】爬取新浪微博签到页
基于微博签到页的微博爬虫 项目链接:https://github.com/RealIvyWong/WeiboCrawler/tree/master/WeiboLocationCrawler 1 实现功 ...
- shell脚本实现监控shell脚本的执行流程及变量的值
这篇文章主要介绍了shell脚本实现监控shell脚本的执行流程及变量的值本文使用shell完成对执行过程中条件语句中的变量的变化的监控和整个程序的执行流程的观察功能,需要的朋友可以参考下 很多时候, ...
- 79.ZYNQ内部私有定时器中断
上篇文章实现了了PS接受来自PL的中断,本片文章将在ZYNQ的纯PS里实现私有定时器中断.每个一秒中断一次,在中断函数里计数加1,通过串口打印输出. *本文所使用的开发板是Miz702(兼容zedbo ...
- Django-模板语言和过滤器
Django模板语言 首先模板只是一个文本文件,它可以生成任何基于文本的格式(HTML.XML.CSS等),模板中包含变量,在模板被渲染的时候替换为最终的值,以及控制模板逻辑的标签. 变量使用{{ 变 ...
- .NET 4.5 Task异步编程学习资料
参考资料: 1. http://www.cnblogs.com/heyuquan/archive/2013/04/18/3028044.html
- hibernate cascade
默认:none Cascade 属性值: none:在保存.删除修改对象的时候,不考虑其附属物的操作 save-update:在保存.更新当前对象时,级联保存.更新附属物. delete:在删除当前对 ...
- MySQL学习笔记:字符串前后补全0
遇到一个需求:不足6位的需要自动补全6位,使用函数LPAD()和RPAD()补全. LPAD(str, len, padstr) 用字符串padstr对str进行左边填充补全直至它的长度达到len个字 ...