CF508D Tanya and Password
题目传送门
这道看似是字符串的题居然是图论
我们把每个字符串的前两个字符和后两个字符看作点,并建边
然后跑欧拉路径即可
有一处小细节:
就是欧拉路径的起点初始不能赋成
0
0
0 而要随便赋一个存在的点
然后后面再更新
因为可能形成一个环,造成
R
E
RE
RE
卡了我一个点嘤嘤嘤
代码:
#include<bits/stdc++.h>
#define freo(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout)
#define ll long long
using namespace std;
const int base=256,maxn=2e5+5;
int n,du[maxn],s,cnt;
vector<int>e[maxn];
stack<char>st;
char ch[5];
inline ll read()
{
ll ret=0;char ch=' ',c=getchar();
while(!(c<='9'&&c>='0')) ch=c,c=getchar();
while(c<='9'&&c>='0') ret=(ret<<1)+(ret<<3)+c-'0',c=getchar();
return ch=='-'?-ret:ret;
}
void dfs(int u)
{
while(e[u].size())
{
int v=e[u][0];
e[u].erase(e[u].begin());
dfs(v);
}
st.push((char)u%265);
}
int main()
{
n=read();
for(int i=1;i<=n;i++)
{
scanf("%s",ch);
int u=ch[0]*base+ch[1],v=ch[1]*base+ch[2];
e[u].push_back(v);
du[u]++;du[v]--;
s=u;
}
for(int i=1;i<maxn;i++)
{
if(du[i]>1||du[i]<-1) {printf("NO");return 0;}
if(du[i]==1) s=i,cnt++;
if(du[i]==-1) cnt++;
}
if(cnt!=0&&cnt!=2) {printf("NO");return 0;}
dfs(s);
st.push((char)(s/256));
if((int)st.size()!=n+2) {printf("NO");return 0;}
printf("YES\n");
while(!st.empty()) printf("%c",st.top()),st.pop();
return 0;
}