词链
/*搜索+技巧+剪枝=AC 该题很像[单词接龙];(https://www.luogu.org/problemnew/show/P1019) 只要在上面加一点技巧即可AC(同样是深搜);
#include<bits/stdc++.h>
using namespace std;
int n,l,bj[100001],flag;
string a[10001],k;
map<char,int>bj1,bj2;
void xx(int x,string y)
{
if(flag==1)
return ;
if(x==n)
{
flag=1;
k=y;
return ;
}
for(int i=1;i<=n;i++)
{
if(bj[i]==0)
{
bj[i]=1;
if(a[i][0]==y[y.length()-1])/*如果第一
个字符串的尾字母等于下一个字符串的首字
母,满足条件将他们拼接;
xx(x+1,y+"."+a[i]);
break;
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
bj1[a[i][0]]++;//找该字符串的首字母出现的次数;
bj2[a[i][a[i].length()-1]]++;/*找该字符串
的尾字母出现的次数;*/
}
int q=1;
sort(a+1,a+n+1);//按字典序排序;
for(int i=1;i<=n;i++)
{
if(bj1[a[i][0]]-bj2[a[i][0]]==1)/*如果该字
母在字符串开头出现次数比在字符串尾部次数多一那
么以该字符开头的字符串一定是第一个字符串*/
{
q=i;
break;//找到一个就退出循环;
}
}
bj[q]=1;//标记第一个字符串下标;
xx(1,a[q]);//深度搜索;
if(flag==0)//表示没有找到;
cout<<"***";
else//已找到;
cout<<k;
return 0;
}