(为了查询错误,我竟然沦落到一行行对AC代码的地步了)然而,尽管思路相同,为啥一个vector会如此伤人?改了四行AC就拜拜了……恳求大佬相助。
链接表->相对的100pts
#include <bits/stdc++.h>
using namespace std;
const int N=1010,inf=1<<29;
int n,len[N],sta[N],cnt[30],top=0;
int head[N],to[N*N],next1[N*N],en;//改
bool flag=false,vis[N];
string s[N];
void dfs(int u)
{
if (flag) return ;
sta[top++]=u;
vis[u]=true;
int v;
for (int i=head[u];i;i=next1[i])//改
{
v=to[i];
if (!vis[v]) dfs(v);
}
if (top==n) flag=true;
else vis[u]=false,--top;
}
void add_edge(int u,int v){
to[++en]=v,next1[en]=head[u],head[u]=en;
}
int main()
{
cin>>n;
for (int i=1;i<=n;i++)
cin>>s[i];
sort(s+1,s+n+1);
for (int i=1;i<=n;i++)
len[i]=s[i].size();
for (int i=1;i<=n;i++)
for (int j=n;j>=1;j--)
if (i!=j && s[i][len[i]-1]==s[j][0])
add_edge(i,j);//改
for (int i=1;i<=n;i++)
cnt[s[i][0]-'a']++,cnt[s[i][len[i]-1]-'a']--;
int k=0,h;
for (int i=0;i<26;i++){
if (cnt[i]==1) k++,h=i;
if (cnt[i]==2) k=2;
if (k==2) break;
}
if (k==2) cout<<"***\n";
else if (k==1){
for (int i=1;i<=n;i++)
if (s[i][0]-'a'==h)
dfs(i);
}
else {
for (int i=1;i<=n;i++)
dfs(i);
}
if (!flag) {
cout<<"***\n";
return 0;
}
cout<<s[sta[0]];
for (int i=1;i<top;i++)
cout<<'.'<<s[sta[i]];
cout<<endl;
return 0;
}
vector->30pts
#include <bits/stdc++.h>
using namespace std;
const int N=1010,inf=1<<29;
int n,len[N],sta[N],cnt[30],top=0;
vector<int> a[N];//不同处
bool flag=false,vis[N];
string s[N];
void dfs(int u)
{
if (flag) return ;
sta[top++]=u;
vis[u]=true;
int v;
for (int i=0;i<a[u].size();i++)//不同处
{
v=a[u][i];
if (!vis[v]) dfs(v);
}
if (top==n) flag=true;
else vis[u]=false,--top;
}
int main()
{
cin>>n;
for (int i=1;i<=n;i++)
cin>>s[i];
sort(s+1,s+n+1);
for (int i=1;i<=n;i++)
len[i]=s[i].size();
for (int i=1;i<=n;i++)
for (int j=n;j>=1;j--)
if (i!=j && s[i][len[i]-1]==s[j][0])
a[i].push_back(j);//不同处
for (int i=1;i<=n;i++)
cnt[s[i][0]-'a']++,cnt[s[i][len[i]-1]-'a']--;
int k=0,h;
for (int i=0;i<26;i++){
if (cnt[i]==1) k++,h=i;
if (cnt[i]==2) k=2;
if (k==2) break;
}
if (k==2) cout<<"***\n";
else if (k==1){
for (int i=1;i<=n;i++)
if (s[i][0]-'a'==h)
dfs(i);
}
else {
for (int i=1;i<=n;i++)
dfs(i);
}
if (!flag) {
cout<<"***\n";
return 0;
}
cout<<s[sta[0]];
for (int i=1;i<top;i++)
cout<<'.'<<s[sta[i]];
cout<<endl;
return 0;
}