翻了很多讨论,但是好像没有和我一样的。。。
记录详情\
#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小时了,一直找不到原因。