H - 韩爷的情书

Time Limit: 6000/2000MS (Java/Others)     Memory Limit: 262144/262144KB (Java/Others)
Submit Status

某年某月某日,韩爷被妹子表白了\o/

同时,韩爷收到了来自妹子的情书。在好奇心的驱使下,众人想要一览究竟。 显然,羞涩韩爷是不会把情书直接拿出来的。 假设情书长度为n+2,韩爷从中提取出n个长度为3的连续字符串,分给了n个人。

现在这n个人向你求助,能否帮他们把情书恢复出来。

Input

第一行一个数字 n (1≤n≤2⋅105)表示有n个字符串

接下来n行,每行是三个字符组成的字符串。字符可能是小写字母、大写字母或数字。

注意可能会有相同的字符串。

Output

如果韩爷耍了小聪明的,即所求的字符串并不存在,输出NO

否则,输出YES,并且输出任意一个可能的字符串。

Sample input and output

Sample Input Sample Output
4
baa
caa
aax
aay
NO
5
123
234
345
456
567
YES
1234567
3
123
231
312
YES
23123

Hint

当字符串存在时,字符串可能不唯一,比如样例3下,12312、31231也是符合题意的。

解题报告:

这是一道有向图欧拉路存在问题的题目.

我们可以很容易想到题目的边是两个单词一组建边,我们采用 2 位的62进制来表示2个单词这个点,之后建立有向图,同时还要建立一次无向图.

  1. 首先判定原图是否连通,跑一次dfs即可
  2. 之后跑一次全图的度数,欧拉路存在的条件是

<1>.所有点的入度 = 出度

<2>有一个点的入度 – 出度 = 1 , 一个点 入度 – 出度 = - 1,其他点入度 = 出度.

通过 2 ,可以很容易确定起点(入度 – 出度 = -1 ,或者第一种情况的话任意点都行),跑一次dfs,把边压栈,最后打印即可

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <map>
#include <vector>
#include <stack>
#define pb push_back
/* #ifdef DIABLO 3
嘲笑命运这幽默的安排
#endif */ #ifndef outedge typedef struct Edge
{
char s1,s2;
int v;
Edge(const char* s1,const char *s2,const int *v)
{
this->s1 = *s1 , this->s2 = *s2 , this->v = *v;
}
}; #endif using namespace std;
const int maxn = * ;
const int limit = * ;
const char * all = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
const int length = strlen(all);
map<char,int>pos;
int n,indig[maxn],outdig[maxn];
char buffer[];
vector<Edge>DE[maxn]; //有向边
vector<Edge>UE[maxn]; //无向边
vector<int>s1; // indig - outdig = 1
vector<int>s2; // indig - outdig = -1
stack<char>out;
bool use[maxn],arrive[maxn];
char hashstring[maxn][]; // 62进制压缩
inline int HashValue(const char *st)
{
return *pos[st[]] + pos[st[]];
} void init_letter_table()
{
int tot = ;
for(int i = ; i < ; ++ i)
pos[char(i+'a')] = tot++;
for(int i = ; i < ; ++ i)
pos[char(i+'A')] = tot++;
for(int i = ; i < ; ++ i)
pos[char(i+'')] = tot++;
} void dfs(int cur)
{
arrive[cur] = true;
for(int i = ; i < UE[cur].size() ; ++ i)
{
int nextnode = UE[cur][i].v;
if (!arrive[nextnode])
dfs(nextnode);
}
} bool judge()
{
if (s1.size() != s2.size())
return false;
else if(s1.size() >= || s2.size() >= )
return false;
return true;
} void print_ans(int cur)
{
char x1 = hashstring[cur][];
char x2 = hashstring[cur][];
while(DE[cur].size())
{
int nextnode = DE[cur][DE[cur].size() - ].v;
char x3 = hashstring[nextnode][];
DE[cur].pop_back();//删边
print_ans(nextnode);
out.push(x3);
}
} int main(int argc,char *argv[])
{
init_letter_table();
memset(arrive,false,sizeof(arrive));memset(use,false,sizeof(use));memset(indig,,sizeof(indig));memset(outdig,,sizeof(outdig));
scanf("%d",&n);
int beginteger;
for(int i = ; i < n ; ++ i)
{
scanf("%s",buffer);
int t1 = HashValue(buffer) , t2 = HashValue(buffer + );
use[t1] = true , use[t2] = true;
beginteger = t1;
hashstring[t1][] = buffer[] , hashstring[t1][] = buffer[] , hashstring[t2][] = buffer[] , hashstring[t2][] = buffer[];
UE[t1].pb(Edge(buffer,buffer+,&t2)) , UE[t2].pb(Edge(buffer,buffer+,&t1)); //无向边连接
DE[t1].pb(Edge(buffer,buffer+,&t2)); //有向边连接
outdig[t1] ++ , indig[t2] ++ ;
}
dfs(beginteger); //连通性测试
int check = ;
for(int i = ; i < limit ; ++ i)
if(use[i] == true && arrive[i] == false)
check = ;
if (!check) //图不连通
{
printf("NO\n");
return ;
}
for(int i = ; i < limit ; ++ i)
if(use[i])
{
int x = indig[i] - outdig[i];
if (x == ) continue;
else if(x == ) s1.pb(i);
else if(x == -) s2.pb(i);
else check = ;
}
if (!check || !judge()) //非法
{
printf("NO\n");
return ;
}
printf("YES\n");
if (s2.size()==)
beginteger = s2[];
print_ans(beginteger);
printf("%c%c",hashstring[beginteger][],hashstring[beginteger][]);
while(!out.empty())
{
printf("%c",out.top());
out.pop();
}
printf("\n");
return ;
}

UESTC_韩爷的情书 2015 UESTC Training for Graph Theory<Problem H>的更多相关文章

  1. UESTC_方老师和农场 2015 UESTC Training for Graph Theory<Problem L>

    L - 方老师和农场 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  2. UESTC_小panpan学图论 2015 UESTC Training for Graph Theory<Problem J>

    J - 小panpan学图论 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) S ...

  3. UESTC_邱老师的脑残粉 2015 UESTC Training for Graph Theory<Problem D>

    D - 邱老师的脑残粉 Time Limit: 12000/4000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Sub ...

  4. UESTC_秋实大哥带我飞 2015 UESTC Training for Graph Theory<Problem B>

    B - 秋实大哥带我飞 Time Limit: 300/100MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit ...

  5. UESTC_韩爷的梦 2015 UESTC Training for Search Algorithm & String<Problem N>

    N - 韩爷的梦 Time Limit: 200/100MS (Java/Others)     Memory Limit: 1300/1300KB (Java/Others) Submit Stat ...

  6. UESTC_王之盛宴 2015 UESTC Training for Graph Theory<Problem K>

    K - 王之盛宴 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit  ...

  7. UESTC_排名表 2015 UESTC Training for Graph Theory<Problem I>

    I - 排名表 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit S ...

  8. UESTC_传输数据 2015 UESTC Training for Graph Theory<Problem F>

    F - 传输数据 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit  ...

  9. UESTC_树上的距离 2015 UESTC Training for Graph Theory<Problem E>

    E - 树上的距离 Time Limit: 2000/1000MS (Java/Others)     Memory Limit: 262143/262143KB (Java/Others) Subm ...

随机推荐

  1. C# 通过线程更新UI

    摘自:http://msdn.microsoft.com/zh-cn/library/ms171728(en-us,VS.80).aspx 关键代码(form中增加): delegate void S ...

  2. web字体格式及几种在线格式转换工具介绍

    原文地址:http://blog.csdn.net/xiaolongtotop/article/details/8316554 目前,文字信息仍是网站最主要的内容,随着CSS3技术的不断成熟,Web字 ...

  3. windows10 离线包安装net3.5

    找到离线镜像: 管理员命令行运行:dism.exe /online /enable-feature /featurename:netfx3 /Source:E:\sources\sxs 路径根据实际情 ...

  4. PC--CSS命名

    头:header内 容:container尾:footer导航:nav侧栏:sidebar栏目:column页 面外围控制整体布局宽度:wrapper左右中:left right center登录条: ...

  5. linux下修改防火墙端口对外开放方法

    ---linix CentOS7的防火墙换成了firewall了,这里做一些记录,下面是一些命令:添加例外端口:# firewall-cmd --add-port=8080/tcp删除例外端口:# f ...

  6. Hibernaate事务管理

    Hibernate使用session时需要继承HibernateDaoSupport对象 HibernateDaoSupport对象中包含默认的getSession()方法,但不可以通过该方法直接启动 ...

  7. PHP连接sql server 2005环境配置

    一.Windows下PHP连接SQLServer 2005 设定:安装的Windows操作系统(Win7 或XP均可.其它系统暂未測试),在C盘下:PHP的相关文件位于c:/PHP以下,其配置文件ph ...

  8. 《TCP/IP具体解释卷2:实现》笔记--4种不同类型的mbuf

    mbuf的主要用途是保存子进程和网络接口间互相传递的用户数据.但mbuf也用于保存其它各种数据:源于目的地址.插口 选项等等. 以下介绍我们要遇到的四种类型的mbuf,它们根据在成员m_flag中填写 ...

  9. Xcode5和6上新建工程如何本地化启动页面

    建议阅读本篇文章前先具备iOS本地化的基本知识,Google中搜索“iOS本地化”,有成片的教程~~ 最近有个app需要支持英语.简体中文.繁体中文,由于启动页面上有文字,所以也不得不做下本地化处理. ...

  10. VML :Vector Markup Language

    在以前老是浏览器IE<9在不支持SVG情况下,IE一般通过VML来绘制图形,图片,文字等 步骤: 必须在头部添加 <HTML xmlns:v="urn:schemas-micro ...