2851648_wa.cpp
来自「北大大牛代码 1240道题的原代码 超级权威」· C++ 代码 · 共 125 行
CPP
125 行
#include <stdio.h>
#include <algorithm>
using namespace std;
int n;
int adj[27][27];
int din[27], dout[27];
int visited[27], mark[27];
struct node
{
int len;
char str[21];
}name[1001];
bool cmp(node a,node b)
{
return strcmp(a.str,b.str)<0;
}
void dfs(int v)
{
int i;
visited[v] = 1;
for (i = 0; i < 26; i++)
{
if(adj[v][i]&&!visited[i])
dfs(i);
}
}
int main()
{
int f1, f2, flag;
int t, i, j, len, tt;
int st, ed;
int start, cnt;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
memset(adj,0,sizeof(adj));
memset(din,0,sizeof(din));
memset(dout,0,sizeof(dout));
memset(mark,0,sizeof(mark));
memset(visited,0,sizeof(visited));
for (i = 0; i < n; i++)
{
scanf("%s",name[i].str);
name[i].len = len = strlen(name[i].str);
adj[name[i].str[0]-'a'][name[i].str[len-1]-'a'] = 1;
adj[name[i].str[len-1]-'a'][name[i].str[0]-'a'] = 1;
dout[name[i].str[0]-'a']++;
din[name[i].str[len-1]-'a']++;
mark[name[i].str[0]-'a'] = mark[name[i].str[len-1]-'a'] = 1;
}
dfs(name[n-1].str[0]-'a');
tt = 0;
for (i = 0; i < 26; i++)
{
if(mark[i]&&!visited[i])
{
printf("***\n");
goto con;
}
}
for(i = 0; i < 27; i++)
{
if(mark[i])
{
if(din[i]==dout[i])
mark[i]=0;
}
}
flag = f1 = f2 = 1;
for (i = 0; i < 27; i++)
{
if(mark[i])
{
flag = 0;
tt++;
if(din[i]-dout[i]==1)
ed = i,f1 = 0;
if(din[i]-dout[i]==-1)
st = i,f2 = 0;
}
}
if(flag||(!f1&&!f2&&tt==2))
{
sort(name,name+n,cmp);
for(i = 0; i < n; i++)
{
j = i;
mark[name[i].str[0]-'a'] = i;
while(j<n&&name[j].str[0]==name[i].str[0])
j++;
i = j-1;
}
cnt = 0;
if(flag)
start = 0;
else
start = mark[st];
while(cnt<n)
{
printf("%s",name[start].str);
mark[name[start].str[0]-'a']++;
start = mark[name[start].str[name[start].len-1]-'a'];
cnt++;
if(cnt==n)
printf("\n");
else
printf(".");
}
}
else
puts("***");
con:
;
}
return 0;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?