CF508D Tanya and Password

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值