犯了一个超级傻的错。尾部多输出了一个空格。p==-1 时也会输出空格,害我调试了好久好久。。。。
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <stack> #include <algorithm> #include <cmath> #include <map> #define LL long long #define DB double using namespace std; const int N = 1009; char ch[N][22]; struct LT{ int to,nex; int p; }L[N<<1]; int F[150],cnt; int v[N<<1],n; int in[150]; void add(int f,int t,int p) { L[cnt].nex = F[f];L[cnt].to = t; L[cnt].p = p; F[f] = cnt++; } int ou; void dfs(int k,int p) { for(int i=F[k];i;i=L[i].nex) { int to = L[i].to; if(!v[i]) { v[i] = 1; dfs(to,L[i].p); } } if(ou&&p>=0) printf(" ");else ou = 1; if(p!=-1) printf("%s",ch[p]); } int visit[150]; void dfs1(int k) { if(!visit[k]) return ; visit[k] = 0; for(int i=F[k];i;i=L[i].nex) { dfs1(L[i].to); } } void solve(int T) { int c=0,f=-1; for(int i=0;i<150;i++) if(in[i]!=0) { if(in[i]==0) continue; if(in[i]==1||in[i]==-1) c++; else c = 10; if(in[i]==1) f = i; } if(f==-1) f = ch[0][0]; dfs1(f); for(int i=0;i<150;i++) if(visit[i]) c=10; if(c>2){printf("Case %d: No\n",T);return;} printf("Case %d: Yes\n",T); memset(v,0,sizeof(v)); ou = 0; dfs(f,-1); printf("\n"); } int main() { #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); #endif int cas,T=1;scanf("%d",&cas); while(cas--) { scanf("%d",&n); memset(F,0,sizeof(F)); memset(in,0,sizeof(in)); cnt = 1; memset(visit,0,sizeof(visit)); for(int i=0;i<n;i++) { scanf("%s",ch[i]); int a= ch[i][0],b=ch[i][strlen(ch[i])-1]; add(b,a,i); visit[a] = visit[b] = 1; in[a]--,in[b]++; } solve(T);T++; } return 0; }