【题目链接】:http://codeforces.com/problemset/problem/508/D

【题意】



给你一个字符的所有连续3个的子串;

让你复原出原串;

(包含小写、大写字母以及数字);

【题解】



相当于给你n条边;

每条边的两端;

一个点是由s[0]s[1]组成的;

另一端是s[1]s[2]组成的;

(用map很容易做hash..)

然后让你求一个欧拉通路;

即经过所有的边仅一次的路径(一笔画);

有向图;

可以先算出每个点的入度和出度;

设入度和出度的差的点数为1的个数为cnt;

则只有当cnt为2或cnt为0的时候有解;

当cnt==2时,其中出度-入度==1的点作为起点,出度-入度==-1的点作终点;

当cnt==0时,随便取个点当起点;

然后做fleury算法就好;

(求出来的是逆序的,倒一下就好)

讲得比较好的

↓↓







看了上面的分析;

可以知道;

在搜一个点的时候,往前走的同时删边;

然后一条路走到黑;

把中间没有出度的点输出就好(倒序的);

然后对于中间还有出度的点再一条道走到黑就好(肯定能回来的);

然后重复上述步骤;

得到倒序的欧拉路径;



【Number Of WA】



0



【完整代码】

#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define ms(x,y) memset(x,y,sizeof x)
#define Open() freopen("F:\\rush.txt","r",stdin)
#define Close() ios::sync_with_stdio(0),cin.tie(0) typedef pair<int,int> pii;
typedef pair<LL,LL> pll; const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int N = 2e5+100; int n,tot,in[N*2],out[N*2],f[N*2],s,t;
char S[4];
map <string,int> dic;
string is[N*2];
vector <int> G[N*2];
stack <int> sta;
string ans=""; int ff(int x)
{
if (f[x]!=x)
return f[x] = ff(f[x]);
else
return x;
} void wujie()
{
cout <<"NO"<<endl;
exit(0);
} void dfs(int x)
{
while (G[x].size())
{
//cout << x << endl;
sta.push(x);
int y = G[x][G[x].size()-1];
G[x].pop_back();
x = y;
}
sta.push(x);
} void oula(int s)
{
sta.push(s);
int flag = 0;
while (!sta.empty())
{
int x = sta.top();
int bridge = (G[x].size()==0);
sta.pop();
if (!bridge)
{
dfs(x);
}
else
{
if (!flag)
{
ans+=is[x][1];
ans+=is[x][0];
flag = 1;
}
else
ans+=is[x][0];
}
}
} int main()
{
//Open();
Close();//scanf,puts,printf not use
//init??????
cin >> n;
string s1,s2;
rep1(i,1,2*n)
f[i] = i;
rep1(i,1,n)
{
cin >> S;
s1 = S[0];
s1+=S[1];
s2 = S[1];
s2+=S[2];
if (dic[s1]==0)
tot++,dic[s1] = tot,is[tot] = s1;
if (dic[s2]==0)
tot++,dic[s2] = tot,is[tot] = s2;
int x = dic[s1],y = dic[s2];
in[y]++,out[x]++;
G[x].pb(y);
int r1 = ff(x),r2 = ff(y);
if (r1!=r2)
f[r1] = r2;
}
n = tot;
int root = ff(1);
rep1(i,1,tot)
if (ff(i)!=root)
wujie();
int cnt = 0;
rep1(i,1,n)
{
if (in[i]==out[i]) continue;
cnt++;
if (in[i]-out[i]==-1)
s = i;
else
if (in[i]-out[i]==1)
t = i;
else
wujie();
}
//cout << tot <<endl;
//cout <<is[1]<<endl;
//cout <<is[2]<<endl;
//cout <<is[3]<<endl;
//cout <<is[4]<<endl;
//cout <<"s="<<s<<' '<<"t="<<t<<endl;
//return 0;
if ( (cnt==2 && s!=0 && t!=0) || (cnt==0))
{
cout <<"YES"<<endl;
if (cnt==0) s = 1;
oula(s);
reverse(ans.begin(),ans.end());
cout << ans << endl;
}
else
wujie();
return 0;
}

【codeforces 508D】Tanya and Password的更多相关文章

  1. 【codeforces 761C】Dasha and Password(动态规划做法)

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  2. 【codeforces 761C】Dasha and Password(贪心+枚举做法)

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  3. 【codeforces 508D】The Maths lecture

    [题目链接]:http://codeforces.com/problemset/problem/507/D [题意] 让你找符合这样数字的数的个数: 1.有n个数码 2.某个后缀%k的值为0 3.大于 ...

  4. 【codeforces 415D】Mashmokh and ACM(普通dp)

    [codeforces 415D]Mashmokh and ACM 题意:美丽数列定义:对于数列中的每一个i都满足:arr[i+1]%arr[i]==0 输入n,k(1<=n,k<=200 ...

  5. 【codeforces 707E】Garlands

    [题目链接]:http://codeforces.com/contest/707/problem/E [题意] 给你一个n*m的方阵; 里面有k个联通块; 这k个联通块,每个连通块里面都是灯; 给你q ...

  6. 【codeforces 707C】Pythagorean Triples

    [题目链接]:http://codeforces.com/contest/707/problem/C [题意] 给你一个数字n; 问你这个数字是不是某个三角形的一条边; 如果是让你输出另外两条边的大小 ...

  7. 【codeforces 709D】Recover the String

    [题目链接]:http://codeforces.com/problemset/problem/709/D [题意] 给你一个序列; 给出01子列和10子列和00子列以及11子列的个数; 然后让你输出 ...

  8. 【codeforces 709B】Checkpoints

    [题目链接]:http://codeforces.com/contest/709/problem/B [题意] 让你从起点开始走过n-1个点(至少n-1个) 问你最少走多远; [题解] 肯定不多走啊; ...

  9. 【codeforces 709C】Letters Cyclic Shift

    [题目链接]:http://codeforces.com/contest/709/problem/C [题意] 让你改变一个字符串的子集(连续的一段); ->这一段的每个字符的字母都变成之前的一 ...

随机推荐

  1. mysql 的特殊函数

    1. FORMAT() 函数 函数用于对字段的显示进行格式化 语法: SELECT FORMAT(column_name,format) FROM table_name column_name  必需 ...

  2. 使用pdf文本域模板生成对应的pdf

    第一步: 下载jar包 <!-- itext的pdf的依赖--> <dependency> <groupId>com.itextpdf</groupId> ...

  3. Installer - Eclipse配置Data Source Explorer

    一.配置Oracle数据库连接 1.打开配置窗口 在[window]菜单中的[show windows]选择[other],在弹出的窗口中选择[Data Source Explorer]进行数据数据库 ...

  4. Delphi编写后台监控软件

    Delphi编写后台监控软件         文章来源:Delphi程序员之家     后台监控软件,为了达到隐蔽监控的目的,应该满足正常运行时,不显示在任务栏上,在按Ctrl+Alt+Del出现的任 ...

  5. 第十九篇:Mysql两次Group by和ip转数字作比较的一次优化

    业务场景:两张表,ipconfig_group表存了单位和 ip 起始段信息 visit_info表存储了访问次数,失败次数,访问流量,用户ip等信息 两张表的关系为:    一个部门下有若干ip段, ...

  6. 宇宙最强 IDE:VS 2019 正式发布

    作者:局长 来源:www.oschina.net/news/105629/ 如约而至,微软已于今天推出 Visual Studio 2019 正式版,一同发布的还有 Visual Studio 201 ...

  7. VMware Workstation 10 简体中文安装教程

    分享到 一键分享 QQ空间 新浪微博 百度云收藏 人人网 腾讯微博 百度相册 开心网 腾讯朋友 百度贴吧 豆瓣网 搜狐微博 百度新首页 QQ好友 和讯微博 更多... 百度分享 分享到 一键分享 QQ ...

  8. FineUI使用记录

    @{ ViewBag.Title = "Grid/Grid"; var F = Html.F();} @section body { @(F.Grid().IsFluid(true ...

  9. grep 查看前后几行和参数匹配

    如果在只是想匹配模式的上下几行,grep可以实现.   grep -5 'parttern' inputfile //打印匹配行的前后5行 grep -C 5 'parttern' inputfile ...

  10. Django中static文件的引入

    1. 在django project中创建 static文件夹 2.settings.py中配置要在 STATIC_URL = '/static/'  下边 STATICFILES_DIRS = [ ...