( ̄▽ ̄)"

//不知道为什么,用scanf输入char数组的话,字符获取失效
//于是改用cin>>string,就可以了
//这题字符的处理比较麻烦,输入之后转成数字,用到函数get(char),get_num(string,int)
//最后字符的输出是反向输出的,用到函数get_char(int)
//这道题也算是到无向图输出欧拉路的模板题,判有无欧拉路用到函数ok()
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<string>
#include<cstdlib>
#include<vector>
#include<stack>
using namespace std;
typedef long long ll;
const int MAXN=200010; struct node
{
int next; //E[i].next指向图中与i同父的下一个结点
int to; //E[i].to指向图中i的子结点
}E[MAXN]; int vis[MAXN],fa[MAXN]; //vis:两字符构成串映射的点
int in[MAXN/2],ans[MAXN];
int cnt,pcnt,n,st,flag1,flag2; //cnt:边下标 pcnt:点下标 n:串数 st:图遍历的起点 void add(int u,int v)
{
E[cnt].to=v;
E[cnt].next=fa[u];
fa[u]=cnt++;
return ;
} int get(char s)
{
if(s>='0'&&s<='9') return s-'0';
else if(s>='a'&&s<='z') return s-'a'+10;
else return s-'A'+36;
} int get_num(string s,int index)
{
if(index==0)
return get(s[0])*100+get(s[1]);
else
return get(s[1])*100+get(s[2]);
} char get_char(int x)
{
if(x<10) return x+'0';
if(x<36) return x-10+'a';
return x-36+'A';
} void init()
{
scanf("%d",&n);
cnt=0;pcnt=0;
memset(fa,-1,sizeof(fa));
memset(vis,-1,sizeof(vis));
memset(in,0,sizeof(in));
string str; for(int i=0;i<n;i++)
{
cin>>str;
int u=get_num(str,0);
int v=get_num(str,1);
add(u,v); if(vis[u]==-1) //vis[u]记录边权为u的点是第几个被访问的
{
vis[u]=pcnt;
ans[pcnt++]=u; //点下标++
}
if(vis[v]==-1)
{
vis[v]=pcnt;
ans[pcnt++]=v;
}
//边1从vis[u]点连出,边2从vis[v]点连入
in[vis[u]]++; //第vis[u]个点的度++
in[vis[v]]--;
}
} void DFS(int x)
{
for(int i=fa[x];i!=-1;i=fa[x])
{
if(vis[i]==0)
{
vis[i]=1;
fa[x]=E[i].next;
DFS(E[i].to);
}
}
ans[pcnt++]=x;
} bool ok()
{
int i;
flag1=0,flag2=0;
for(i=0;i<pcnt;i++)
{
if(in[i]<-1||in[i]>1) //<-1表示入度大于1,>1表示出度大于1
break; //此时此图一定无法形成欧拉路
if(in[i]==1)
flag1++;
if(in[i]==-1)
flag2++;
}
if(i<pcnt || !(flag1==flag2 && flag1<=1))
return false;
else
return true;
} int main()
{
init(); if(ok())
{
st=ans[0];
for(int i=0;i<pcnt;i++)
if(in[i]==1)
st=ans[i]; //st记录图起点
pcnt=0;
memset(vis,0,sizeof(vis)); //以上找起点、清零是为DFS做准备
DFS(st);
if(pcnt<n+1)
printf("NO\n");
else
{
printf("YES\n");
printf("%c%c",get_char(ans[pcnt-1]/100),get_char(ans[pcnt-1]%100));
for(int i=pcnt-2;i>=0;i--)
printf("%c",get_char(ans[i]%100));
printf("\n");
}
}
else
printf("NO\n");
return 0;
}

CF 508D Tanya and Password(无向图+输出欧拉路)的更多相关文章

  1. POJ 2513 trie树+并查集判断无向图的欧拉路

    生无可恋 查RE查了一个多小时.. 原因是我N define的是250500 应该是500500!!!!!!!!! 身败名裂,已无颜面对众人.. 吐槽完了 我们来说思路... 思路: 判有向图能否形成 ...

  2. CodeForces - 508D Tanya and Password(欧拉通路)

    Description While dad was at work, a little girl Tanya decided to play with dad characters. She has ...

  3. codeforces 508D . Tanya and Password 欧拉通路

    题目链接 给你n个长度为3的子串, 这些子串是由一个长度为n+2的串分割得来的, 求原串, 如果给出的不合法, 输出-1. 一个欧拉通路的题, 将子串的前两个字符和后两个字符看成一个点, 比如acb, ...

  4. poj2513(无向图判欧拉路)

    链接:id=2513">点击打开链接 题意:一堆木棍左右两端涂有颜色,同样颜色的能够连接在一起,问全部木棍是否能都连上 代码: #include <map> #includ ...

  5. hiho48 : 欧拉路·一

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho最近在玩一个解密类的游戏,他们需要控制角色在一片原始丛林里面探险,收集道具,并找到最后的宝藏.现在他们控制的 ...

  6. [hihoCoder] 第四十九周: 欧拉路·一

    题目1 : 欧拉路·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho最近在玩一个解密类的游戏,他们需要控制角色在一片原始丛林里面探险,收集道具,并找到最 ...

  7. hiho一下 第四十九周 欧拉路&#183;一

    [题目链接]:click here~~ 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描写叙述 小Hi和小Ho近期在玩一个解密类的游戏.他们须要控制角色在一片原始丛林里面探险 ...

  8. 【HIHOCODER 1176】 欧拉路·一

    描述 小Hi和小Ho最近在玩一个解密类的游戏,他们需要控制角色在一片原始丛林里面探险,收集道具,并找到最后的宝藏.现在他们控制的角色来到了一个很大的湖边.湖上有N个小岛(编号1..N),以及连接小岛的 ...

  9. POJ1386Play on Words[有向图欧拉路]

    Play on Words Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 11846   Accepted: 4050 De ...

随机推荐

  1. 向量空间(Vector Spaces)

    向量空间(Vector Spaces) 向量空间又称线性空间,是线性代数的中心内容和基本概念之一.在解析几何里引入向量的概念后,是许多问题的处理变得更为简洁和清晰,在此基础上的进一步抽象化,形成了与域 ...

  2. 【c++】size_t 和 size_type的区别

    为了使自己的程序有很好的移植性,c++程序员应该尽量使用size_t和size_type而不是int, unsigned 1. size_t是全局定义的类型:size_type是STL类中定义的类型属 ...

  3. 超链接解决头部fixed问题

    ///////////超链接解决头部fixed问题 $('a[href*=#]').click(function () { var top1 = $(".header").heig ...

  4. Spring第三天

    Spring第三天 整体课程安排(3天+2天): 第一天:Spring框架入门.IoC控制反转的配置管理.Spring Web集成.Spring Junit集成. 第二天:Spring AOP面向切面 ...

  5. JEMETER 录制

    两种方式: 第一种:badboy工具录制,导入jemeter脚本,导入jemeter.目测支持IE 第二种:代理服务器的方式 1.

  6. NDK常见错误

    1.错误1: android mk文件没有定义 $ ndk-buildAndroid NDK: Your APP_BUILD_SCRIPT points to an unknown file: /cy ...

  7. Firebug入门指南

    据说,对于网页开发人员来说,Firebug是Firefox浏览器中最好的插件之一. 我最近就在学习怎么使用Firebug,网上找到一篇针对初学者的教程,感觉比较有用,就翻译了出来. ========= ...

  8. 《JS权威指南学习总结--6.6属性getter和setter》

    内容要点: 一.对象属性     对象属性是由名字.值和一组特性构成的.在ES5中,属性值可以用一个或两个方法替代,这两个方法就是getter和setter.由getter和setter定义的属性称做 ...

  9. hdu_5585_Less Time, More profit(二分+最大权闭合图)

    题目链接:hdu_5585_Less Time, More profit 题意: 有n个工厂,每建一个工厂要花费vi,需要时间ti,然后有m个商店,每个商店需要在指定的k个工厂中进货,才能盈利,如果其 ...

  10. HUST 1358 Uiwurerirexb jeqvad(模拟解密)

    Uiwurerirexb jeqvad Description Fmur lan oxbrvu mzx, E abpxcay Jvmffabza qdxwfaou eb vmjsad.xdz, eb ...