45分求助
查看原帖
45分求助
708883
YIZHIXIAOLUREN1楼主2022/7/13 16:45

45分,最后一个点wa,剩下的TLE

#include<bits/stdc++.h>
using namespace std;
#define MAXN 1005
int n;
string zm[MAXN];
vector <string> fl[30];//边 
vector <int> fli[30];//对应的字符串 
int vis[MAXN];


string sx[MAXN];//储存答案 
int sxi=0;

void output(){
	if(sxi<n){
		cout << "***";
		return;
	}
	for(int i=0;i<n-1;i++){
		cout << sx[i] << ".";
	}
	cout << sx[n-1];
}

void dfs(int k,int ni){
	//cout << k << endl;//
	if(k>n){
		output();
		exit(0);
	}
	if(ni>=0){
		int fir=zm[ni][zm[ni].size()-1]-'a';	
		if(!fl[fir].empty()){
			for(int i=0;i<fl[fir].size();i++){
				if(vis[fli[fir][i]]==0){
					sx[sxi]=fl[fir][i];
					
					
					sxi++;
					//cout << fli[fir][i] << endl;//
					vis[fli[fir][i]]=1;
					
					//for(int i=0;i<n;i++)cout << vis[i] << " ";//
					//cout << fl[fir][i] << endl;//
					
					
					dfs(k+1,fli[fir][i]);
					sxi--;
					vis[fli[fir][i]]=0;
					//cout << endl;//
				}
			}
		}
	}
}

int main(){
	std::ios::sync_with_stdio(false);
	cin >> n;
	string xc;
	int frn[26]={0},lan[26]={0};
	for(int i=0;i<n;i++){
		cin >> xc;
		zm[i]=xc;
		fl[xc[0]-'a'].push_back(xc);
		fli[xc[0]-'a'].push_back(i);
		frn[xc[0]-'a']++;
		lan[xc[xc.size()-1]-'a']++;
	}//输入 
	
	for(int i=0;i<26;i++){
		if(!fl[i].empty()){
			sort(fl[i].begin(),fl[i].end());
			fl[i].erase(unique(fl[i].begin(),fl[i].end()),fl[i].end());
		}
	}//排序 
	/*
	for(int i=0;i<26;i++){
		if(!fl[i].empty()){
			for(int j=0;j<fl[i].size();j++)cout << fl[i][j] << " ";
			cout << endl;
		}
	}
	*/
	int fir,las;
	int firn=0,lasn=0;
	for(int i=0;i<26;i++){
		if(frn[i]==lan[i]+1){
			fir=i;
			firn++;
		}else if(frn[i]==lan[i]-1){
			las=i;
			lasn++;
		}
	}
	
	if(firn>1||lasn>1||(firn+lasn==1)){
		cout << "***";
		return 0;
	}
	if(firn+lasn==0){
		for(int i=0;i<26;i++){
			if(!fl[i].empty()){
				for(int j=0;j<fl[i].size();j++){
					sx[sxi]=fl[i][j];
					sxi++;
					vis[fli[i][j]]=1;
					dfs(2,fli[i][j]);
					sxi--;
					vis[fli[i][j]]=0;
				}
			}
		}
	}else{
		for(int i=0;i<fl[fir].size();i++){
			sx[sxi]=fl[fir][i];
			sxi++;
			vis[fli[fir][i]]=1;
			dfs(2,fli[fir][i]);
			sxi--;
			vis[fli[fir][i]]=0;
		}
	}//初步判断解并dfs 
	cout << "***";
}

2022/7/13 16:45
加载中...