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