欧拉路有人能调?,悬n关(QAQ)
  • 板块灌水区
  • 楼主Martlet
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/8/8 14:57
  • 上次更新2024/8/8 15:44:42
查看原帖
欧拉路有人能调?,悬n关(QAQ)
543717
Martlet楼主2024/8/8 14:57

题目传送门

#include<bits/stdc++.h>
using namespace std;
int m;
int n;
map<string,int> mp;
map<int,string> mp2;
struct lp{
	string a;
	int v;
};
vector<lp> g[114514];
int du[114514][2];
int top;
stack<int> ans;
int in[114514];
int del[114514];
int d[1000100];
void dot(int now){
	d[now] = 1;
	for(lp v:g[now]){
		if(d[v.v])continue;
		dot(v.v);
	}
}
void dfs(int now)
{
	for(int i=del[now];i<g[now].size();i=del[now])
	{ 
		del[now]=i+1;
		dfs(g[now][i].v);
	}
	ans.push(now);
}
int S;
int cnt[10];
int tot = 1145;
bool cmp(string x,string y){
	int len=min(x.size(),y.size());
	for(register int i=0;i<len;++i){
		if(x[i]<y[i]) return 1;
		else if(x[i]>y[i]) return 0;
	}
	return x.size()<y.size();
}
bool cmp2(lp a,lp b){
	return cmp(a.a,b.a);
}
string pp[114514];
char ll = 'a';
int main(){
	cin>>m;
	for(int i = 1;i <= m;i++){
		string a;
		cin>>a;
		char st = a[0];
		char en = a[a.size()-1];
		tot++;
		mp2[tot] = a;
		ll = st;
		string En = "";En+=en;
		g[st].push_back(lp{a,tot});
		g[tot].push_back(lp{En,int(en)});
		du[st][1]++;
		du[tot][1]++;
		du[tot][0]++;
		du[en][0]++;
	}
	for(int i = 'a';i <= 'z';i++){
		sort(g[i].begin(),g[i].end(),cmp2);
	}
	S = 1;
	dot(ll);
	bool flag = 1;
	for(int i='a';i<='z';i++)
	{
        if(du[i][1]!=du[i][0])
        {
            flag=0;
            if(du[i][1]-du[i][0]==1/*出度比入度多1*/) cnt[1]++,S=i;
            else if(du[i][0]-du[i][1]==1/*入度比出度多1*/) cnt[0]++;
            else return puts("***"),0;
        }
    }
    for(int i=1145+1;i<=tot;i++)
	{
        if(du[i][1]!=du[i][0])
        {
            flag=0;
            if(!d[i]){
            	return puts("***"),0;
			}
            if(du[i][1]-du[i][0]==1/*出度比入度多1*/) cnt[1]++,S=i;
            else if(du[i][0]-du[i][1]==1/*入度比出度多1*/) cnt[0]++;
            else return puts("***"),0;
        }
    }
	if((!flag)&&!(cnt[0]==cnt[1]&&cnt[0]==1)) return !puts("***"),0;
	//cout<<st<<endl;
	dfs(S);
	//cout<<S<<endl;
	int ges = 0;
	while(!ans.empty()){
		if(ans.top()>1145)pp[++ges] = mp2[ans.top()];
		ans.pop();
		//if(!ans.empty())cout<<".";
	}
	for(int i = 1;i < ges;i++){
		cout<<pp[i]<<".";
	}
	cout<<pp[ges];
	return 0;
} 
2024/8/8 14:57
加载中...