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. 关于Yeoman使用的总结

    Yeoman由三部分组成 Yo 用于项目构建. Grunt 用于项目管理,任务制定. Bower 用于项目依赖管理. 经过一段时间的使用,对这些东西有了一些个人总结: 总体上说这些内容学习曲线略高,不 ...

  2. 自定义ScrollViewer的Touch事件--触摸上下移动ScrollViewer滚动到指定位置

    double mPointY;//触摸点的Y坐标 double mOffsetY;//滚动条当前位置 bool mIsTouch = false;//是否触摸 //触摸事件 private void ...

  3. 虚函数virtual

    简单地说,那些被virtual关键字修饰的成员函数,就是虚函数.虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离:用形象的语言来解释就是实现以共同 ...

  4. JavaScript - 基于原型的面向对象

    JavaScript - 基于原型的面向对象 1. 引言 JavaScript 是一种基于原型的面向对象语言,而不是基于类的!!! 基于类的面向对象语言,比如 Java,是构建在两个不同实体的概念之上 ...

  5. 查看登录用户who

    几个命令:wwho每隔5秒钟,就来查看hadoop是否已经登录,如登录,显示其已经登录,并退出:sleep whoami last,显示/var/log/wtmp文件,显示用户登录历史及系统重启历史  ...

  6. WPF可视化控件打印

    Introduction While coding an application that displays a detailed report in a ScrollViewer, it was d ...

  7. redis安装配置和使用;tomcat安装和使用

    virtualbox主要有以下几种方式(不同版本号称法不一样,但实质是一样的): 1.Intelnal Network:利用主机上的全部的虚拟机构建一个虚拟网络 2.NAT:能訪问互联网,不能訪问主机 ...

  8. 解决angular 与django的冲突

    {% block main %} <script type="text/javascript" src="http://cdnjs.cloudflare.com/a ...

  9. Rhythmbox乱码的解决的方法

    近期尝试 Listen 和 Banshee 才发现,Rhythmbox 上出现的 mp3乱码问题依然,并且更加严重,想要彻底弄清和解决必须搞清两点,第一, mp3 标签类型和编码,第二,各种播放器对 ...

  10. Query获取值常用

    Query获取Select选择的Text和Value:语法解释:1. $("#select_id").change(function(){//code...});   //为Sel ...