luogu_1341 无序字母对

#include <cstring>
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
int n,ans[100010],cnt,in[60];
vector<int> G[60];
bool vis[60],answer,dis[60][60],oula;
char word[]={‘A‘,‘B‘,‘C‘,‘D‘,‘E‘,‘F‘,‘G‘,‘H‘,‘I‘,‘J‘,‘K‘,‘L‘,‘M‘,‘N‘,‘O‘,‘P‘,‘Q‘,‘R‘,‘S‘,‘T‘,‘U‘,‘V‘,‘W‘,‘X‘,‘Y‘,‘Z‘,
‘a‘,‘b‘,‘c‘,‘d‘,‘e‘,‘f‘,‘g‘,‘h‘,‘i‘,‘j‘,‘k‘,‘l‘,‘m‘,‘n‘,‘o‘,‘p‘,‘q‘,‘r‘,‘s‘,‘t‘,‘u‘,‘v‘,‘w‘,‘x‘,‘y‘,‘z‘};

char getc(){
    char c;
    c=getchar();
    while(1){
        if(‘a‘<=c && c<=‘z‘ || (‘A‘<=c && c<=‘Z‘))return c;
        c=getchar();
    }
}

void make(){
    for(int i=1;i<=n;i++){
        char u,v;
        int u1,v1;
        u=getc(); v=getc();
        if(‘A‘<=u && u<=‘Z‘)u1=u-‘A‘;
        else u1=u-‘a‘+26;
        if(‘A‘<=v && v<=‘Z‘)v1=v-‘A‘;
        else v1=v-‘a‘+26;
        in[u1]++; in[v1]++;
		vis[u1]=vis[v1]=1;
        G[u1].push_back(v1); G[v1].push_back(u1);
    }
}

bool check(){
	int sum=0;
	for(int i=0;i<52;i++)if(in[i]%2==1)sum++;
	if(sum!=2 && sum)return false;
	return true;
}

void dfs(int u){
	ans[++cnt]=u;
	for(int i=0;i<G[u].size();i++){
		int v=G[u][i];
		if(cnt==n+1)return;
		if(!dis[u][v]){
			dis[u][v]=1; dis[v][u]=1;
			dfs(v);
			dis[u][v]=0; dis[v][u]=1;
		}
	}
	if(cnt!=n+1)cnt--;
}

int main(){
    scanf("%d",&n);
    make();
	if(!check()){puts("No Solution"); return 0;}
	for(int i=0;i<52;i++)sort(G[i].begin(),G[i].end());
	int start=0;
    for(int i=0;i<52;i++)
		if(vis[i]){start=i; break;}
    for(int i=0;i<52;i++)
    	if(in[i]%2==1){start=i; break;}
	dfs(start);
	for(int i=1;i<=cnt;i++)putchar(word[ans[i]]);
	puts("");
    return 0;
}

  

时间: 2024-10-13 01:46:30

luogu_1341 无序字母对的相关文章

洛谷P1341 无序字母对[无向图欧拉路]

题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第一行输入一个正整数n. 以下n行每行两个字母,表示这两个字母需要相邻. 输出格式: 输出满足要求的字符串. 如果没有满足要求的字符串,请输出“No Solution”. 如果有多种方案,请输出前面的字母的ASCII编码尽可能小的(字典序最小)的方案 输入输出样例 输入样例#1: 4 aZ tZ Xt aX 输

无序字母对

本题地址:http://www.luogu.org/problem/show?pid=1341 题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第一行输入一个正整数n.以下n行每行两个字母,表示这两个字母需要相邻. 输出格式: 输出满足要求的字符串.如果没有满足要求的字符串,请输出“No Solution”.如果有多种方案,请输出前面的字母的ASCII编码尽

洛谷P1341 无序字母对(欧拉回路)

P1341 无序字母对 题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第一行输入一个正整数n. 以下n行每行两个字母,表示这两个字母需要相邻. 输出格式: 输出满足要求的字符串. 如果没有满足要求的字符串,请输出“No Solution”. 如果有多种方案,请输出前面的字母的ASCII编码尽可能小的(字典序最小)的方案 输入输出样例 输入样例#1: 4 a

洛谷P1341 无序字母对

P1341 无序字母对 229通过 806提交 题目提供者yeszy 标签图论福建省历届夏令营 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 不知道哪里错 求解释 题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第一行输入一个正整数n. 以下n行每行两个字母,表示这两个字母需要相邻. 输出格式: 输出满足要求的字符串. 如果没有满足要求的字符串,

洛谷1341 无序字母对

本题地址:http://www.luogu.org/problem/show?pid=1341 题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第一行输入一个正整数n. 以下n行每行两个字母,表示这两个字母需要相邻. 输出格式: 输出满足要求的字符串. 如果没有满足要求的字符串,请输出“No Solution”. 如果有多种方案,请输出前面的字母的ASCII

洛谷 P1341 无序字母对 Label:欧拉路 一笔画

题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第一行输入一个正整数n. 以下n行每行两个字母,表示这两个字母需要相邻. 输出格式: 输出满足要求的字符串. 如果没有满足要求的字符串,请输出“No Solution”. 如果有多种方案,请输出前面的字母的ASCII编码尽可能小的(字典序最小)的方案 输入输出样例 输入样例#1: 4 aZ tZ Xt aX 输

1341 无序字母对

难度:提高+/省选- 题目类型:图论 提交次数:6 涉及知识:dfs/欧拉路径 题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第一行输入一个正整数n. 以下n行每行两个字母,表示这两个字母需要相邻. 输出格式: 输出满足要求的字符串. 如果没有满足要求的字符串,请输出"No Solution". 如果有多种方案,请输出前面的字母的ASCII编码尽

luogu P1341 无序字母对

P1341 无序字母对 直通 思路: 欧拉回路问题 坑点: ①第三个点出现了 5 ab ac ad ae af 这样的情况 所以我们需要加一点小优化: for(int i=0; i<=top; i++) { //特判第三个点... if(i==0) continue; if(!tmp[ans[i]][ans[i-1]]) { printf("No Solution"); return 0; } } ②我们还需要保证题目中给出的所有字母均在ans数组中出现,所以需要开2个vis数组

p1341 无序字母对

传送门 题目 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入格式: 第一行输入一个正整数n. 以下n行每行两个字母,表示这两个字母需要相邻. 输出格式: 输出满足要求的字符串. 如果没有满足要求的字符串,请输出"No Solution". 如果有多种方案,请输出前面的字母的ASCII编码尽可能小的(字典序最小)的方案 分析 任意俩字母的相邻关系可表示为一条路径,所以在相邻字母间