UESTC_韩爷的情书 2015 UESTC Training for Graph Theory<Problem H>
H - 韩爷的情书
Time Limit: 6000/2000MS (Java/Others) Memory Limit: 262144/262144KB (Java/Others)
某年某月某日,韩爷被妹子表白了\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 |
NO |
5 |
YES |
3 |
YES |
Hint
当字符串存在时,字符串可能不唯一,比如样例3下,12312、31231也是符合题意的。
解题报告:
这是一道有向图欧拉路存在问题的题目.
我们可以很容易想到题目的边是两个单词一组建边,我们采用 2 位的62进制来表示2个单词这个点,之后建立有向图,同时还要建立一次无向图.
- 首先判定原图是否连通,跑一次dfs即可
- 之后跑一次全图的度数,欧拉路存在的条件是
<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>的更多相关文章
- UESTC_方老师和农场 2015 UESTC Training for Graph Theory<Problem L>
L - 方老师和农场 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submi ...
- 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 ...
- UESTC_邱老师的脑残粉 2015 UESTC Training for Graph Theory<Problem D>
D - 邱老师的脑残粉 Time Limit: 12000/4000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Sub ...
- UESTC_秋实大哥带我飞 2015 UESTC Training for Graph Theory<Problem B>
B - 秋实大哥带我飞 Time Limit: 300/100MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit ...
- 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 ...
- UESTC_王之盛宴 2015 UESTC Training for Graph Theory<Problem K>
K - 王之盛宴 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit ...
- UESTC_排名表 2015 UESTC Training for Graph Theory<Problem I>
I - 排名表 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit S ...
- UESTC_传输数据 2015 UESTC Training for Graph Theory<Problem F>
F - 传输数据 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit ...
- UESTC_树上的距离 2015 UESTC Training for Graph Theory<Problem E>
E - 树上的距离 Time Limit: 2000/1000MS (Java/Others) Memory Limit: 262143/262143KB (Java/Others) Subm ...
随机推荐
- Spring使用小结2
之前做过不少spring想过知识点内容的摘录, Spring框架的特点.模块组成.优缺点 spring相关的bean管理想过知识点及依赖注入方式 今天说下近端时间中项目中遇到的相关印象比较深的知识点 ...
- SEO的URL如何优化才是最佳
原文地址:http://www.chinaz.com/web/2007/0413/6841.shtml 很多人都知道URL对SEO的重要之处,但是很多站点却忽略了站点的路径优化.今天本人在这里写几点关 ...
- PC--CSS技巧
1.图片不存在的时候,显示一个默认图片 <img src=”01.jpg” onerror=”this.src=’02.jpg'” /> 2.CSS强制图片自适应大小 img {width ...
- SEXTANTE中调用任意C++控制台程序的简单例子
在sextante中单纯利用python或者调用sextante已有算法进行自定义开发,很多情况下速度不咋给力,同样的操作调用QGIS的C++插件比用sextante里的算法要快,有时候快的 还不止一 ...
- C语言获取系统当前时间转化成时间字符串
因为保存的文件须要加上保存的时间,所以须要一个函数来将系统当前时间获取出来,同一时候转换成时间字符串.详细的时间代码例如以下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...
- [Hapi.js] Up and running
hapi is a rock solid server framework for Node.js. Its focus on modularity and configuration-over-co ...
- qemu-kvm-1.1.0源代码中关于迁移的代码分析
这篇文档基于qemu-kvm-1.1.0源代码进行分析. 首先,源代码中的hmp-commands.hx文件里有下面内容: { .name = "migrate",/* 在moni ...
- hadoop下载
1.输入网址: http://mirrors.cnnic.cn/apache/hadoop/common/ 2.选择需要的版本进行点击下载
- 系统简单的UIImagePickerController
1.从系统相册中读取 /* 判断选择的读取类型是否支持 UIImagePickerControllerSourceTypePhotoLibrary,普通相册 UIImagePickerControll ...
- 使用Spring JDBCTemplate简化JDBC的操作
使用Spring JDBCTemplate简化JDBC的操作 接触过JAVA WEB开发的朋友肯定都知道Hibernate框架,虽然不否定它的强大之处,但个人对它一直无感,总感觉不够灵活,太过臃肿了. ...