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

  

posted @ 2017-09-21 19:44  wqtnb_tql_qwq_%%%  阅读(118)  评论(0编辑  收藏  举报