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 ...
随机推荐
- 关于Yeoman使用的总结
Yeoman由三部分组成 Yo 用于项目构建. Grunt 用于项目管理,任务制定. Bower 用于项目依赖管理. 经过一段时间的使用,对这些东西有了一些个人总结: 总体上说这些内容学习曲线略高,不 ...
- 自定义ScrollViewer的Touch事件--触摸上下移动ScrollViewer滚动到指定位置
double mPointY;//触摸点的Y坐标 double mOffsetY;//滚动条当前位置 bool mIsTouch = false;//是否触摸 //触摸事件 private void ...
- 虚函数virtual
简单地说,那些被virtual关键字修饰的成员函数,就是虚函数.虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离:用形象的语言来解释就是实现以共同 ...
- JavaScript - 基于原型的面向对象
JavaScript - 基于原型的面向对象 1. 引言 JavaScript 是一种基于原型的面向对象语言,而不是基于类的!!! 基于类的面向对象语言,比如 Java,是构建在两个不同实体的概念之上 ...
- 查看登录用户who
几个命令:wwho每隔5秒钟,就来查看hadoop是否已经登录,如登录,显示其已经登录,并退出:sleep whoami last,显示/var/log/wtmp文件,显示用户登录历史及系统重启历史 ...
- WPF可视化控件打印
Introduction While coding an application that displays a detailed report in a ScrollViewer, it was d ...
- redis安装配置和使用;tomcat安装和使用
virtualbox主要有以下几种方式(不同版本号称法不一样,但实质是一样的): 1.Intelnal Network:利用主机上的全部的虚拟机构建一个虚拟网络 2.NAT:能訪问互联网,不能訪问主机 ...
- 解决angular 与django的冲突
{% block main %} <script type="text/javascript" src="http://cdnjs.cloudflare.com/a ...
- Rhythmbox乱码的解决的方法
近期尝试 Listen 和 Banshee 才发现,Rhythmbox 上出现的 mp3乱码问题依然,并且更加严重,想要彻底弄清和解决必须搞清两点,第一, mp3 标签类型和编码,第二,各种播放器对 ...
- Query获取值常用
Query获取Select选择的Text和Value:语法解释:1. $("#select_id").change(function(){//code...}); //为Sel ...