[lougu1341]无序字母对
Description:
给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒)。请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现。
Solution:
欧拉回路裸题,注意大写字母和小写字母在ASCII码中不连续,还有要求最小字典序(用multiset存图每次有限遍历最小的)
code:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<set>
using namespace std;
const int MAXX=10000;
multiset<int>to[MAXX];
int f[MAXX],deg[MAXX],q[MAXX];
int n,tot,ans,cnt,s=-1;
bool vis[MAXX],num[MAXX],flag;
inline int find(int x){
if(f[x]==x)return x;
else return f[x]=find(f[x]);
}
inline void dfs(int x){
for(set<int>:: iterator it=to[x].begin();it!=to[x].end();it=to[x].begin()){
int y=*it;
to[x].erase(it);
to[y].erase(to[y].find(x));
dfs(y);
}
q[++tot]=x;
}
int main(){
cin>>n;
for(int i=0;i<=99;++i)f[i]=i;
for(int i=1;i<=n;++i){
char a,b;
int x,y;
cin>>a>>b;
x=a-'A';y=b-'A';
int u=find(x);
int v=find(y);
f[u]=v;
vis[x]=1;vis[y]=1;
deg[x]++;deg[y]++;
to[x].insert(y);
to[y].insert(x);
}
for(int i=0;i<=99;++i){
if(!vis[i])continue;
num[find(i)]=1;
}
for(int i=0;i<=99;++i){
if(!vis[i])continue;
ans+=num[i];
if(s==-1)s=i;
if(deg[i]&1){
cnt++;
if(flag)continue;
s=i;
flag=1;
}
}
if((cnt!=0&&cnt!=2)||ans>1){
cout<<"No Solution"<<endl;
return 0;
}
dfs(s);
for(int i=tot;i>=1;--i){
char ss='A'+q[i];
cout<<ss;
}
return 0;
}
[lougu1341]无序字母对的更多相关文章
- 洛谷P1341 无序字母对[无向图欧拉路]
题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第一行输入一 ...
- 洛谷 P1341 无序字母对 Label:欧拉路 一笔画
题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第一行输入一 ...
- P1341 无序字母对 欧拉回路
题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第一行输入一 ...
- [luogu1341]无序字母对【欧拉回路】
题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 分析 欧拉回路的模板题. 暴力删边欧拉 ...
- P1341 无序字母对
题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第一行输入一 ...
- 【洛谷P1341】无序字母对
题目大意:给定 n 个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有 n+1 个字母的字符串使得每个字母对都在这个字符串中出现. 题解:每个无需字母对可以看成无 ...
- 洛谷 P1341 无序字母对 解题报告
P1341 无序字母对 题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 ...
- 无序字母对 character
无序字母对 character 题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入 ...
- 「LuoguP1341」 无序字母对(欧拉回路
题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第一行输入一 ...
随机推荐
- keytool常用操作
keytool 秘钥需要存储在秘钥库中,秘钥库可以理解为一个存储了一个或多个秘钥的文件.一个秘钥库可以存储多个密钥对,每个秘钥对你都需要给他们取一个名字. D:\software\Java\jdk1. ...
- python note #1
To record my process of studying python and to practice my English meanwhile, I'd like to start writ ...
- 对GPDB查询计划的Motion结点的理解
GPDB在进行join查询时,可能会产生Motion结点 根据官方文档,总共有这几种Motion: redistribute 重分布(用hash取模的方法把join字段重分布到各个segment,相当 ...
- ArcGIS api for javascript——查询,立刻打开信息窗口
描述 本例展示了当一个要素被查询时如何立刻打开一个InfoWindow.信息窗口能被用来将要素的属性格式化成用户易读的格式. 本例中,地图和查询任务都使用ESRI sample server上的服务K ...
- 怎样查看电脑的IP地址
在DOW窗体 :cmd->ipconfig 见截图:
- Draw the RGB data from kinect C++ via opengl
In order to improve my English writing skills,I am going to write the blogs in English form now! -- ...
- Linux下大型容量件的切割与合并
Linux下大型容量件的切割与合并 当前目录下有sp4.exe文件容量129M我用64的U盘把spe.exe考到另一台机器上#split -b 60m sp4.exe-b, --bytes=SIZE ...
- javaScript for in循环遍历对象
for循环常被我们用来遍历数组,而如何遍历对象呢? 这时就需要用到for in循环了 写一个遍历对象名简写如下: for(var xxx in ooo){console.log(xxx)} 其中xxx ...
- node.js状态码
100——客户必须继续发出请求101——客户要求服务器根据请求转换HTTP协议版本200——交易成功201——提示知道新文件的URL202——接受和处理.但处理未完成203——返回信息不确定或不完整2 ...
- 紫书 例题 9-6 UVa 11400 (线性结构上的动态规划)
这道题的下标从1开始比较方便,一方面前缀和算的方便一些,一方面涉及到前j 个灯泡,那么如果从0开始,前3个灯泡就是第0, 1, 2, 3个,非常奇怪. 所以灵活换下标. 然后这道题的动规有点暴力枚举的 ...