• 欧拉回路/通路 Codeforces Round #288 (Div. 2)


    http://codeforces.com/contest/508/problem/D

    以上是题目链接

    题目大意 给n个字符串看能不能链接在一起

    因为 三个三个分割 所以字符串  如abc ab作为起点 bc作为终点

    hash思想 加细节处理 欧拉图均满足

    #include<cstdio>
    #include<map>
    //#include<bits/stdc++.h>
    #include<vector>
    #include<stack>
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    #include<set>
    #include<queue>
    #include<cstdlib>
    #include<climits>
    #include<cctype>
    #define PI acos(-1.0)
    #define INF 0x3fffffff
    using namespace std;
    typedef long long ll;
    typedef __int64 int64;
    const ll mood=1e9+7;
    const int64 Mod=100000007;
    const double eps=1e-9;
    const int N=8e3;
    const int MAXN=250050;
    typedef int rl;
    inline void r(rl&num){
        num=0;rl f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9')num=num*10+ch-'0',ch=getchar();
        num*=f;
    }
    int gt(char a)//hash
    {
        if(isdigit(a)) return a-'0';
        if(islower(a)) return a-'a'+10;
        return a-'A'+36;
    }
    int ha(char a,char b)
    {
        return gt(a)*100+gt(b);
    }
    char fg(int a)
    {
        if(a<10)return a+'0';
        if(a<=gt('z')) return a-10+'a';
        return a-36+'A';
    }
    vector<int>v[N];
    string ss;
    void dfs(int x)
    {
        while(!v[x].empty()){
            int tem=v[x].back();
            v[x].pop_back();
            dfs(tem);
        }
        ss+=fg(x%100);
        //cout<<ss<<endl;
    }
    int ind[N];
    int main()
    {
        char ch[3];
        int n;
        r(n);
        for(int i=0;i<n;i++)
        {
            scanf("%s",ch);
            int s=ha(ch[0],ch[1]),e=ha(ch[1],ch[2]);
            v[s].push_back(e);
            ind[s]++;ind[e]--;
        }
        int st=-1,out=0;//-1表示回路
        for(int i=0;i<N;i++)
        {
            if(ind[i]>=1){
                st=i;
                out++;
            }
        }
        if(out>1||ind[st]>1)//ind[s] 表示图仅有一个点指向多个点构成
        {
            puts("NO");
            return 0;
        }
        if(st==-1)
        {
            for(int i=0;i<N;i++)
            {
                if(!v[i].empty())
                {
                    st=i;
                    break;
                }
            }
        }
        dfs(st);
        ss+=fg(st/100);
        if(ss.size()==n+2)
        {
            puts("YES");
           for(int i=n+1;i>=0;i--)
                cout<<ss[i];
        }
        else{
            puts("NO");
        }
        return 0;
    }
    欧拉
  • 相关阅读:
    并查集
    贪心
    分治
    二分
    操作系统基础知识--《操作系统原理(第4版)(普通高等教育"十一五"国家级规划教材)》读书笔记
    《自控力》读书记录
    计算机组成原理基础知识--《计算机组成原理与汇编语言程序设计(第4版)(高等学校规划教材)》读书笔记
    ansible自动部署模板文件中列表长度判断
    《股市稳赚》摘录
    yarn学习小结
  • 原文地址:https://www.cnblogs.com/Geek-xiyang/p/5353306.html
Copyright © 2020-2023  润新知