求调(考虑回路,排序,不连通,但是46)
查看原帖
求调(考虑回路,排序,不连通,但是46)
1132005
Contingency_Core楼主2024/3/12 17:05

翻了很多讨论,但是好像没有和我一样的。。。
记录详情\

#include <iostream>                          
#include <cmath>
#include <algorithm>
#include <cstring>
#include <queue>
#include <cstdio>
#include <map>
#include <vector>
#include <list>
#include <functional>
#include <stack>
#include <unordered_map>
#define m(a,b) make_pair(a,b)
#define F first
#define S second
using namespace std;
queue <int> c[30];//一个字母可以通向的字母
queue <int> lu[30][30]; //两点间路径的单词在数组中位置
int a[1003],lena;
bool cmp(string &a,string &b)
{
	if(a.size()>b.size())
		return 0;
	if(a.size()<b.size())
		return 1;
	return a<b;
}
void find(int &x)
{
	int c1;
	while(!c[x].empty())
	{
		c1=c[x].front();
		c[x].pop();
		find(c1);
	}
	a[lena++]=x;
}
int main()
{
	int n,cd[30]={},rd[30]={},st=-1,e=-1;
	string s[1003];
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cin>>s[i];
	}
	sort(s,s+n,cmp);
	for(int i=0;i<n;i++)
	{
		lu[s[i][0]-'a'][s[i][s[i].size()-1]-'a'].push(i);
		c[s[i][0]-'a'].push(s[i][s[i].size()-1]-'a');
		cd[s[i][0]-'a']++;
		rd[s[i][s[i].size()-1]-'a']++;
	}
	for(int i=0;i<26;i++)
	{
		if(cd[i]!=rd[i])
		{
			if(cd[i]==rd[i]+1)
			{
				if(st!=-1)
				{
					cout<<"***";
					return 0;
				}
				else
					st=i;
			}
			else if(cd[i]+1==rd[i])
			{
				if(e!=-1)
				{
					cout<<"***";
					return 0;
				}
				else
					e=i;
			}
			else
			{
				cout<<"***";
				return 0;
			}
			
		}
	}
	if(st==-1)
	{
		for(int i=0;i<26;i++)
		{
			if(!c[i].empty())
			{
				st=i;
				break;
			}
		}
	}
	find(st);
	if(lena!=n+1)
	{
		cout<<"***";
		return 0;
	}
	for(int i=lena-1;i>=2;i--)
	{
		cout<<s[lu[a[i]][a[i-1]].front()]<<'.';
		lu[a[i]][a[i-1]].pop();
	}
	cout<<s[lu[a[1]][a[0]].front()];
	return 0;
}

调了加起来快4小时了,一直找不到原因。

2024/3/12 17:05
加载中...