洛谷P1341 无序字母对
2016-07-17 17:14
148 查看
题目描述
给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒)。请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现。
输入输出格式
输入格式:第一行输入一个正整数n。
以下n行每行两个字母,表示这两个字母需要相邻。
输出格式:输出满足要求的字符串。
如果没有满足要求的字符串,请输出“No Solution”。
如果有多种方案,请输出前面的字母的ASCII编码尽可能小的(字典序最小)的方案
输入输出样例
输入样例#1:4 aZ tZ Xt aX输出样例#1:
XaZtX
说明
【数据规模与约定】
不同的无序字母对个数有限,n的规模可以通过计算得到。
生气!
本来想刷道水题玩,结果没1A
不但没1A,还WA了好多次!
原因又是数组不够大!
FAQ!
欧拉路
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> using namespace std; int mp[200][200]; char s[5]; int d[80]; int n; int sta[12000]; int top=0; void dfs(int s){ for(int i=0;i<70;i++){ if(mp[s][i]){ mp[s][i]=mp[i][s]=0; dfs(i); } } sta[++top]=s; return; } int main(){ scanf("%d",&n); int i,j; int tmp=100; for(i=1;i<=n;i++){ scanf("%s",s); int u=s[0]-'A',v=s[1]-'A'; tmp=min(tmp,u); tmp=min(tmp,v); mp[u][v]=mp[v][u]=1; d[u]++;d[v]++; } int st=-1,cnt=0; for(i=0;i<70;i++){ if(d[i]%2==1){ if(st==-1)st=i; cnt++; } } if(!cnt)dfs(tmp); else if(cnt==2)dfs(st); else{printf("No Solution\n");return 0;} while(top){ printf("%c",(sta[top--]+'A')); } return 0; }
相关文章推荐
- modesim 仿真问题
- Unity4.3.4_2D—刚体移动
- 【总结】485
- java笔记
- 今日头条面试相关
- HTML5-3
- 动态规划算法详解
- Floyd --任意两点之间的最短路问题
- runtime结合category和block动态增加方法以及属性
- hibernate3之核心组件configuration
- 用文件IO而不是stdio输入输出
- Js中诡异的Array.length
- CSS3过渡transition
- 编程是一种美德,是促使一个人不断向上发展的一种原动力。
- 动态规划算法详解
- 动态规划算法详解
- 动态规划算法详解
- 关于UINavigationBar加载不规则的图片的总结
- ESFramework ——可堪重任的网络通信框架
- caffe 进行自己的imageNet训练分类:loss一直是87.3365,accuracy一直是0