80pts,TLE#8#9,求助
查看原帖
80pts,TLE#8#9,求助
50190
哥你挺6啊楼主2019/8/9 18:17

大致思路:以单词为边判断是否为欧拉图,再通过dfs找欧拉路

代码:

#include<bits/stdc++.h>
using namespace std;
char a[10005][202],s[10005];
int n,len[10005],num[2000],rd[10005],rd0,ll,cd[10005],oula,t1,t2,ans[10005],cnt;
bool b[300][10005];
struct mp{
	int to,word;
}p[300][10005];
void add(int from,int to,int dis)
{
	p[from][++num[from]].to=to;
	p[from][num[from]].word=dis;
}
void dfs(int x)
{
	if(cnt==n)return;
	for(int i=1;i<=num[x];i++)
	{
		if(b[x][i])continue;
		b[x][i]=1;
		ans[++cnt]=p[x][i].word;
	//	cout<<cnt<<' '<<x<<' '<<ans[cnt]<<' '<<p[x][i].to<<endl;
		dfs(p[x][i].to);
		if(cnt==n)return;
		ans[cnt--]=0;
		b[x][i]=0;
	}
	if(cnt==n)return;
}
int main()
{
	//cout<<(int)'a';
	memset(a,0,sizeof(a));
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%s",&a[i]);
	for(int i=1;i<=n;i++)
		len[i]=strlen(a[i]);
	for(int i=1;i<=n;i++)
		s[i]=a[i][0];
	sort(s+1,s+1+n);
	memset(rd,0,sizeof(rd));
	memset(cd,0,sizeof(cd));
	for(int i=1;i<=n;i++)
		add(a[i][0]-96,a[i][len[i]-1]-96,i),
		cd[a[i][0]-96]++,rd[a[i][len[i]-1]-96]++;
	for(int i=1;i<=26;i++)
	{
		if(cd[i]!=rd[i])
		{
			oula++;
			if(!t1)t1=i;
			else t2=i;
		}
		//cout<<char(i+96)<<' '<<rd[i]<<' '<<cd[i]<<endl;
	}//cout<<oula;
	if(oula&&oula!=2)
	{
		printf("***");
		return 0;
	}
	if(oula==2)
	{
		int cr1=cd[t1]-rd[t1],cr2=rd[t1]-cd[t1];
		if((cr1!=1||cr2!=-1)&&(cr1!=-1&&cr2!=1))
		{
			printf("***");
			return 0;
		}
	}
	for(int i=1;i<=26;i++)
	{
		for(int j=1;j<=num[i];j++)
		{
			for(int k=num[i];k>j;k--)
			{
				int to1=p[i][k].word,len1=len[p[i][k].word];
				int to2=p[i][k-1].word,len2=len[p[i][k-1].word];
				for(int l=0;l<min(len1,len2);l++)
				{
		//				cout<<a[to1][l]<<' '<<a[to2][l]<<endl;
					if(a[to1][l]<a[to2][l])
					{
						swap(p[i][k],p[i][k-1]);
						break;
					}
					else if(a[to1][l]>a[to2][l])
						break;
					if(l==min(len1,len2)-1)
					if(len1<len2)swap(p[i][k],p[i][k-1]);
				}
			}
		}
	//	for(int j=1;j<=num[i];j++)
	//	cout<<i<<' '<<j<<' '<<a[p[i][j].word]<<endl;
	}
	int t=0;
	while(t<26)
	{
		memset(b,0,sizeof(b));
		cnt=0;
		dfs(s[++t]-96);
//	
		if(cnt==n)
		{
			for(int i=1;i<=cnt;i++)
			{
				printf("%s",a[ans[i]]);
				if(i<cnt)putchar('.');
			}
			return 0;
		}
	}
	printf("***");
	return 0;
}
/*
6
gopher
rat
aloha
arachnid
tiger
dog

5
qw
we
er
rt
tq

3
wer
rty
yhjnr
***

5
ert
tyu
ujh
hgt
tre
*/ 
2019/8/9 18:17
加载中...