单词拼接
时间限制:3000 ms | 内存限制:65535 KB
难度:5

描述
给你一些单词,请你判断能否把它们首尾串起来串成一串。前一个单词的结尾应该与下一个单词的道字母相同。如

aloha

dog

arachnid

gopher

tiger

rat

可以拼接成:aloha.arachnid.dog.gopher.rat.tiger

输入
第一行是一个整数N(0<N<20),表示测试数据的组数
每组测试数据的第一行是一个整数M,表示该组测试数据中有M(2<M<1000)个互不相同的单词,随后的M行,每行是一个长度不超过30的单词,单词全部由小写字母组成。

输出
如果存在拼接方案,请输出所有拼接方案中字典序最小的方案。(两个单词之间输出一个英文句号".")
如果不存在拼接方案,则输出
***

样例输入
2
6
aloha
arachnid
dog
gopher
rat
tiger
3
oak
maple
elm

样例输出
aloha.arachnid.dog.gopher.rat.tiger
***

来源
Waterloo local 2003.01.25 /POJ

上传者
张云聪

解题:判欧拉路径+连通

有向图存在欧拉路径的条件是所有点的入度等于出度,或者一个点的入度比出度大一,为终点,一点的出度比入度大一,为始点,其余的点入度等于出度。

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <climits>
#include <vector>
#include <queue>
#include <cstdlib>
#include <string>
#include <set>
#include <stack>
#define LL long long
#define pii pair<int,int>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = ;
struct arc {
int to,next;
char str[];
};
arc e[maxn];
int head[maxn],uf[maxn],d[maxn],tot,n,m,cnt;
string str[maxn];
bool vis[maxn];
char ans[maxn][];
bool cmp(const string &a,const string &b) {
return a > b;
}
void add(int u,int v,string &s) {
e[tot].to = v;
e[tot].next = head[u];
strcpy(e[tot].str,s.c_str());
head[u] = tot++;
}
int Find(int x) {
if(x != uf[x]) uf[x] = Find(uf[x]);
return uf[x];
}
void dfs(int u,int id){
for(int i = head[u]; ~i; i = e[i].next){
if(!vis[i]){
vis[i] = true;
dfs(e[i].to,i);
}
}
if(id > -) strcpy(ans[cnt++],e[id].str);
}
int main() {
scanf("%d",&n);
while(n--) {
scanf("%d",&m);
for(int i = tot = ; i < m; ++i)
cin>>str[i];
sort(str,str+m,cmp);
memset(vis,false,sizeof(vis));
memset(head,-,sizeof(head));
for(int i = ; i < ; ++i) {
d[i] = ;
uf[i] = i;
}
for(int i = ; i < m; ++i) {
int u = str[i][] - 'a';
int v = str[i][str[i].length() - ] - 'a';
d[v]--;
d[u]++;
add(u,v,str[i]);
int tx = Find(u);
int ty = Find(v);
if(tx != ty) uf[tx] = ty;
vis[u] = vis[v] = true;
}
int root = ,st = -,a = ,b = ;
bool flag = true;
for(int i = ; i < ; ++i){
if(vis[i]){
if(i == uf[i]) root++;
if(root > ){
flag = false;
break;
}
if(st == -) st = i;
if(abs(d[i]) > ) {
flag = false;
break;
}
if(d[i] == ){
st = i;
a++;
}
if(d[i] == -) b++;
}
}
if(flag &&(a == b && b == || a == b && b == )){
memset(vis,false,sizeof(vis));
cnt = ;
dfs(st,-);
for(int i = cnt-; i >= ; i--)
printf("%s%c",ans[i],i?'.':'\n');
}else puts("***");
}
return ;
}

NYIST 99 单词拼接的更多相关文章

  1. NYOJ 99单词拼接(有向图的欧拉(回)路)

    /* NYOJ 99单词拼接: 思路:欧拉回路或者欧拉路的搜索! 注意:是有向图的!不要当成无向图,否则在在搜索之前的判断中因为判断有无导致不必要的搜索,以致TLE! 有向图的欧拉路:abs(In[i ...

  2. nyoj 99 单词拼接

    点击打开链接 单词拼接 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描述 给你一些单词,请你判断能否把它们首尾串起来串成一串. 前一个单词的结尾应该与下一个单词的道字母相同 ...

  3. 单词拼接(dfs/回溯/递归)

    单词拼接传送门 //单词拼接 #include<stdio.h> #include<string.h> #include<algorithm> using name ...

  4. NYOJ 单词拼接

    # include<iostream> # include<string> # include<string.h> # include<queue> # ...

  5. 【LeetCode-面试算法经典-Java实现】【139-Word Break(单词拆分)】

    [139-Word Break(单词拆分)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given a string s and a dictionary of w ...

  6. nyoj--99--单词拼接(欧垃图判定+输出)

    单词拼接 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描述 给你一些单词,请你判断能否把它们首尾串起来串成一串. 前一个单词的结尾应该与下一个单词的道字母相同. 如 alo ...

  7. 单词倒序(java)

    如何将一串单词组成的字符串倒序呢?如:" we go to school" 变成"school to go we "java代码实现: public stati ...

  8. BUUCTF-writeup

    Reverse RSA 使用openssl模块 rsa -pubin -text -modulus -in pub.key得到n值,在 factordb.com上分解大素数得到p,q值,脚本生成pri ...

  9. JavaSE知识概述集

    一.HelloWord(文档启动Java) /* 使用命令行的方式执行的时候,cmd的默认编码格式是GBK 因此在输入中文的时候需要设置文件的编码格式位ANSI,不会出现乱码错误 注意: 0.先用ja ...

随机推荐

  1. ExtJs 给grid某一单元格重新赋值

    // 司机,搬运工提成 var commissionMoney = (waybillsFtQty * commissionMoneyRatio / personCount).toFixed(2); / ...

  2. Android面试常问的技术问题

    面试时技术经理会问你一些工作中遇到的Android方面的问题.谈谈你所做的项目,和在项目中所扮演的角色. 很多其它内容请參考我的博客:点击打开链接 1.怎样优化ListView? ①Item布局,层级 ...

  3. bzoj5038 四叶草魔杖

    很有意思的最小生成树啊. 网上的题解大多是状压+最小生成树,经过我的试验,其实只要把每个联通块找出来,一个个做一次就可以了. 放一个状压的.懒得再写一个搜索找联通块 #include<cstdi ...

  4. Handle exception in ServiceBase.OnStart method

    https://docs.microsoft.com/en-us/dotnet/api/system.serviceprocess.servicebase.onstart?view=netframew ...

  5. mongodb 对内存的占用监控 ——mongostat,linux系统可用的内存是free + buffers + cached

    刚开始使用mongodb的时候,不太注意mongodb的内存使用,但通过查资料发现mongodb对内存的占用是巨大的,在本地测试服务器中,8G的内存居然被占用了45%.汗呀. 本文就来剖析一下mong ...

  6. 时序数据库深入浅出之存储篇——本质LSMtree,同时 metric(比如温度)+tags 分片

    什么是时序数据库 先来介绍什么是时序数据.时序数据是基于时间的一系列的数据.在有时间的坐标中将这些数据点连成线,往过去看可以做成多纬度报表,揭示其趋势性.规律性.异常性:往未来看可以做大数据分析,机器 ...

  7. thinkphp data方法

    data方法也是模型类的连贯操作方法之一,用于设置当前要操作的数据对象的值,可能大家不太习惯用这个方法,今天来讲解下如何用好data方法. 用法 写操作 通常情况下我们都是通过create方法或者赋值 ...

  8. RabbitMQ安装后,BADARG问题

    最近RabbitMQ安装后始终不能运行,发现异常关键信息如下 =CRASH REPORT==== 10-Nov-2017::13:41:09 === crasher: initial call: ap ...

  9. pdf 转成 一张图片

    1.maven依赖 <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfb ...

  10. SQL Server 置疑、可疑、正在恢复

    一.出错情况 有些时候当你重启了数据库服务,会发现有些数据库变成了正在恢复.置疑.可疑等情况,这个时候DBA就会很紧张了,下面是一些在实践中得到证明的方法. 在一次重启数据库服务后,数据库显示正在恢复 ...