zoukankan      html  css  js  c++  java
  • 1117: 无序字母对 character

    题目描述

    给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒)。请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现。

    题解

    因为有n对要相邻,最后有n+1个字母,所以可以把每个字母对相连,看看能否走一个欧拉路
    具体见代码

    #include <cstdio>
    #define N 127
    using namespace std;
    int n,in[N],f[N],a[N][N],t;char d[3005];
    int get(int x){return x==f[x]?x:f[x]=get(f[x]);}
    void dfs(int x){
        for (int i=1;i<N;i++)
            if (a[x][i]) a[x][i]=a[i][x]=0,dfs(i);
        d[++t]=x;
    }
    int main(){
        scanf("%d",&n);
        for (int i=1;i<N;i++) f[i]=i;
        for (int i=1;i<=n;i++){
            char c1,c2;scanf(" %c%c",&c1,&c2);
            a[c1][c2]=1;a[c2][c1]=1;
            f[get(c1)]=get(c2);
            in[c1]++;in[c2]++;
        }
        int c1=0,g,c2=0;
        for (int i=N-1;i;i--){
            if (f[i]==i && in[i]) c1++;
            if (in[i]&1) c2++,g=i;
        }
        if (c1>1 || (c2^2 && c2^0)) return puts("No Solution"),0;
        if (!c2) for (int i=1;i<N;i++) if (in[i]){g=i;break;}
        dfs(g);putchar(g);
        for (int i=n;i;i--) putchar(d[i]);
        return 0;
    }
    
  • 相关阅读:
    纯快排
    Quick Sort(快速排序)
    归并排序 ALDS1_5_B:Merge Sort
    单调栈(POJ2559)
    Sequence
    Codeforces Round #503
    度度熊学队列
    Always Online hdu 6350
    Hills And Valleys
    Problem G. Depth-First Search
  • 原文地址:https://www.cnblogs.com/xjqxjq/p/10544711.html
Copyright © 2011-2022 走看看