题目大意:
  定义一个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的更多相关文章

  1. POJ2337 Catenyms(欧拉通路的求解)

                                                               Catenyms Time Limit: 1000MS   Memory Limi ...

  2. Catenyms (POJ2337) 字典序最小欧拉路

    // 很久不写图论,连模板也不熟悉了0.0 // 这题是一个技巧性比较高的暴力DFS Catenyms 题目大意 定义catenym为首尾字母相同的单词组成的单词对, 例如: dog.gopher g ...

  3. POJ 2337 Catenyms (有向图欧拉路径,求字典序最小的解)

    Catenyms Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8756   Accepted: 2306 Descript ...

  4. poj2337 欧拉路径

    poj2337 这道题昨天晚上开始做,今天才A.但是问题想透了, 发现其实没那么难 题目大意: 给你一些单词,如果一个单词的末尾字符与另一个单词首字符相同,则两个的单词可以连接.问是否可以把所有单词连 ...

  5. Catenyms

    poj2337:http://poj.org/problem?id=2337 题意:给定一些单词,如果一个单词的尾字母与另一个的首字母相同则可以连接.问是否可以每个单词用一次,将所有单词连接,可以则输 ...

  6. poj2337欧拉回路要求输出路径

                         Catenyms Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8368   Ac ...

  7. POJ 2337 Catenyms (欧拉回路)

    Catenyms Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8173   Accepted: 2149 Descript ...

  8. UVA 10441 - Catenyms(欧拉道路)

    UVA 10441 - Catenyms 题目链接 题意:给定一些单词,求拼接起来,字典序最小的,注意这里的字典序为一个个单词比过去,并非一个个字母 思路:欧拉回路.利用并查集判联通,然后欧拉道路判定 ...

  9. 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 ...

随机推荐

  1. 禅道CMS 获文件名脚本

    use Net::HTTP::GET; use Base64; ; windowWidth=; windowHeight=; sid=jg9g2mk5kmru46lmd3g2evoc87>; # ...

  2. Count 1 in Binary

    Count how many 1 in binary representation of a 32-bit integer. Example Given 32, return 1 Given 5, r ...

  3. 微信web开发者工具无法打开的解决方法

    参考网址:https://blog.csdn.net/gz506840597/article/details/77915488 我试了上面兄弟说的方法还是无效 下面说说我的方法: 我打开文件所在位置, ...

  4. springmvc与struts的区别

    一.拦截机制 1.Struts2 a.Struts2框架是类级别的拦截,每次请求就会创建一个Action,和Spring整合时Struts2的ActionBean注入作用域是原型模式prototype ...

  5. 最详细的block底层

    主要讲述的要点: block 干什么用的 block 语法 block 底层实现 block 变量捕捉 block 的种类.在存储空间中的存储位置 block 循环引用 __block 在ARC 中 ...

  6. Python和MySQL数据库交互PyMySQL

    Python数据库操作 对于关系型数据库的访问,Python社区已经指定了一个标准,称为Python Database API SepcificationV2.0.MySQL.Qracle等特定数据库 ...

  7. Mac上删除不了的文件,Windows上也粉碎不了怎么办?

    推荐一个Mac上的软件:Tuxera Disk Manager 用法很简单:选择删除文件原来所在的文件进行维护就可以了. 维护之后,在废纸篓中清除,成功.

  8. Flask:操作SQLite3(0.1)

    Windows 10家庭中文版,Python 3.6.4,Flask 1.0.2 本文介绍了第一次在Flask框架中操作SQLite3数据库的测试,参考了官网的文档Using SQLite 3 wit ...

  9. ubuntu 16.04 网卡配置 虚拟机上网

    看所有网卡(包括未启动的) ifconfig -a 或者 ip link 查看当前网卡配置,打开配置文件/etc/network/interfaces 设置静态IP(dhcp 为动态获取,static ...

  10. 数据结构之 栈 (Python 版)

    数据结构之 栈 (Python 版) -- 利用线性表实现栈 栈的特性: 后进先出 基于顺序表实现栈 class SStack(): ''' 基于顺序表 实现的 栈类 ''' def __init__ ...