您的位置:首页 > 其它

洛谷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;
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: