单词拼接
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
5
-
描述
-
给你一些单词,请你判断能否把它们首尾串起来串成一串。
前一个单词的结尾应该与下一个单词的道字母相同。
如
aloha
dog
arachnid
gopher
tiger
rat
可以拼接成:aloha.arachnid.dog.gopher.rat.tiger
-
输入
-
第一行是一个整数N(0<N<20),表示测试数据的组数
每组测试数据的第一行是一个整数M,表示该组测试数据中有M(2<M<1000)个互不相同的单词,随后的M行,每行是一个长度不超过30的单词,单词全部由小写字母组成。
输出
-
如果存在拼接方案,请输出所有拼接方案中字典序最小的方案。(两个单词之间输出一个英文句号".")
如果不存在拼接方案,则输出
***
样例输入
-
2 6 aloha arachnid dog gopher rat tiger 3 oak maple elm
样例输出
-
aloha.arachnid.dog.gopher.rat.tiger ***
-
代码:
-
/*变相的欧拉回路, 欧拉回路是构成一个圆, 而此题没有构成一个圆, 所以出度比比入度大1; */ #include<cstdio> #include<cstring> #include<queue> #include<stack> #include<algorithm> #include<vector> #define mem(x,y) memset(x,y,sizeof(x)) #define SI(x) scanf("%d",&x) #define C_C(x) while(x--) using namespace std; const int maxn=1010; const int inf=0x3f3f3f3f; struct node { int begin; int end; char s[33]; }; node pp[maxn]; int degree_in[maxn],degree_out[maxn],id[maxn],n; bool vised[maxn]; void init() { mem(degree_in,0); mem(degree_out,0); mem(vised,false); } int oula() { int i,ans=0; int x1=0,x2=0; for(i=0;i<26;i++) { if(abs(degree_in[i]-degree_out[i])>=2)//这时绝壁构不成欧拉回路 return -1; else if(degree_in[i]-degree_out[i]==1) x1++; else if(degree_in[i]-degree_out[i]==-1) { ans=i; x2++; } } if(x1>1||x2>1) return -1; else if(x1==0) { for(i=0;i<26;i++) if(degree_out[i]) return i; } else return ans; } bool cmp(node a,node b) { return strcmp(a.s,b.s)<0; } bool dfs(int st,int cnt)//判断哪几组数据构成欧拉回路。 { int i; if(cnt==n) return true; for(i=0;i<n;++i) { if(pp[i].begin<st||vised[i]) continue; else if(pp[i].begin>st) return false; vised[i]=true; id[cnt]=i; if(dfs(pp[i].end,cnt+1)) return true; vised[i]=false; } return false; } int main() { int T; int len,i,start; SI(T); C_C(T) { init(); scanf("%d",&n); for(i=0;i<n;i++) { scanf("%s",pp[i].s); len=strlen(pp[i].s); pp[i].begin=pp[i].s[0]-'a'; pp[i].end=pp[i].s[len-1]-'a'; degree_in[pp[i].end]++; degree_out[pp[i].begin]++; } start=oula(); if(start==-1) { printf("***\n"); continue; } sort(pp,pp+n,cmp); if(!dfs(start,0)) { printf("***\n"); continue; } printf("%s",pp[id[0]].s); for(i=1;i<n;i++) printf(".%s",pp[id[i]].s); puts(""); } return 0; }
-
第一行是一个整数N(0<N<20),表示测试数据的组数