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. cf486C Palindrome Transformation

    C. Palindrome Transformation time limit per test 1 second memory limit per test 256 megabytes input  ...

  2. Ubuntu 16.04 LTS 正式发布:系统将持续更新5年

    Canonical 刚刚正式发布了Ubuntu 16.04 LTS (Xenial Xerus),这是一个长期支持版本,官方会提供长达5年的技术支持(包括常规更新/Bug修复/安全升级),一直到202 ...

  3. poj1363

    堆栈的模拟,给定序列,1,2,3,4,...判断堆栈出栈顺序是否合法 5 //5个数入栈1 2 3 4 5 //出栈顺序5 4 1 2 3 //出栈顺序0 //5个数的结束6 //6个数的入栈6 5 ...

  4. ps&&/proc/pid/xxx

    ps 如果想看一个进程的启动时间,可以用lstart来看 [root@jiangyi02.sqa.zmf /home/ahao.mah] #ps -eo pid,lstart,etime,cmd |g ...

  5. 第05讲- DDMS中logcat的使用

    第05讲 DDMS中logcat的使用 1.DDMS DDMS 的全称是Dalvik Debug Monitor Service,是 Android 开发环境中的Dalvik虚拟机调试监控服务.DDM ...

  6. phpcms加载系统类与加载应用类之区别详解

    <?php 1. 加载系统类方法load_sys_class($classname, $path = ''", $initialize = 1)系统类文件所在的文件路径:/phpcms ...

  7. URLConnection的连接、超时、关闭用法总结

    Java中可以使用HttpURLConnection来请求WEB资源. 1. URL请求的类别 分为二类,GET与POST请求.二者的区别在于:      a:) get请求可以获取静态页面,也可以把 ...

  8. Vue2.0环境搭建和测试demo

    Vue2.0 推荐开发环境 Homebrew 1.0.6(Mac).Node.js 6.7.0.npm 3.10.3.webpack 1.13.2.vue-cli 2.4.0.Atom 1.10.2 ...

  9. Transform 1

    Transform字面上就是变形,改变的意思.在CSS3中transform主要包括以下几种:旋转rotate.扭曲skew.缩放scale和移动translate以及矩阵变形matrix.下面我们一 ...

  10. Android Service(上)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/11952435 相信大多数朋友对Service这个名词都不会陌生,没错,一个老练的A ...