求助
  • 板块P1127 词链
  • 楼主piggy
  • 当前回复3
  • 已保存回复3
  • 发布时间2020/9/11 21:37
  • 上次更新2023/11/5 13:24:00
查看原帖
求助
13284
piggy楼主2020/9/11 21:37

给个能出错的数据也行,对拍我拍了好久都没弄出错……

#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
#include <algorithm>
#define For(x) for(int h=head[x],vv=v[h]; h; vv=v[h=nxt[h]])
using namespace std;
int n,N;
string a[2005];

struct Tu{
	int head[2000],nxt[4000],v[4000],cnt,f[2000],vf[4000],ru[2000],chu[2000];
	string s[4000];
	void Add(int x,int y,string ss){
		cnt++;
		nxt[cnt]=head[x];
		v[cnt]=y;
		s[cnt]=ss;
		head[x]=cnt;
	}
	
	bool liantong(int x){
		if (f[x]) return 1;
		f[x]=1;
		For(x) if (!liantong(vv)) return 0;
		return 1;
	}
	
	bool check(){
		int S=0,T=0;
		for (int i=0; i<26; i++){
			if (ru[i]==chu[i]) continue;
			if (ru[i]==chu[i]+1){T++; continue;}
			if (chu[i]==ru[i]+1){S++; continue;}
			return 0;
		}
		if (S>1 || T>1) return 0;
		return 1;
	}
	
	void he(int x){
		string mn="zzzzzzzzzzzzz";
		int mw;
		For(x) if (!vf[h]){
			if (s[h]<mn){
				mw=h;
				mn=s[h];
			}
		}
 		vf[mw]=1;
		N++;
		cout <<s[mw];
		if (N<n) cout <<".";
		if (N==n) return;
		he(v[mw]);
	}
}A,B;

int main(){
	cin >>n;
	for (int i=1; i<=n; i++) cin >>a[i];
	sort(a+1,a+n+1);
	for (int i=n,uuu,vvv; i; i--){
		uuu=a[i][0]-'a';
		vvv=a[i][a[i].length()-1]-'a';
		A.Add(uuu,vvv,a[i]);
		B.Add(uuu,vvv,a[i]);
		B.Add(vvv,uuu,a[i]);
		A.ru[vvv]++;
		A.chu[uuu]++;
	}
	
	for (int i=0; i<26; i++) B.f[i]=0;
	
	if (!B.liantong(0) || !A.check()){
		printf("***");
		return 0;
	}
	
	
	for (int i=0; i<26; i++) if (A.ru[i]+1==A.chu[i]){
		for (int j=1; j<=A.cnt; j++) A.vf[j]=0;
		A.he(i);
		return 0;
	}
	for (int i=0; i<26; i++) if (A.ru[i]){
		for (int j=1; j<=A.cnt; j++) A.vf[j]=0;
		A.he(i);
		return 0;
	}
}

/*
5
ab
ba
ab
bc
bc
*/
2020/9/11 21:37
加载中...