POJ 2337 Catenyms

  1 #include<algorithm>
  2 #include<iostream>
  3 #include<cstring>
  4 #include<string>
  5 #include<cstdio>
  6 #include<vector>
  7 #include<stack>
  8 using namespace std;
  9 struct node
 10 {
 11     int w,num;
 12 };
 13 vector<node>v[27];
 14 stack<int>stk;
 15 int n,f[27],ru[1001],chu[1001];
 16 string s[1001];
 17 bool b[1001];
 18 int fnd(int x)
 19 {
 20     return f[x]==x?x:f[x]=fnd(f[x]);
 21 }
 22 void fluery(int u,int eid)
 23 {
 24     for(int i=0;i<v[u].size();i++)
 25         if(!b[v[u][i].num])
 26         {
 27             b[v[u][i].num]=1;
 28             fluery(v[u][i].w,v[u][i].num);
 29         }
 30     if(eid>0)
 31         stk.push(eid);
 32 }
 33 int main()
 34 {
 35     int t;
 36     scanf("%d",&t);
 37     while(t--)
 38     {
 39         memset(ru,0,sizeof(ru));
 40         memset(chu,0,sizeof(chu));
 41         for(int i=1;i<=26;i++)
 42             v[i].clear();
 43         scanf("%d",&n);
 44         for(int i=1;i<=n;i++)
 45             cin>>s[i];
 46         sort(s+1,s+n+1);
 47         for(int i=1;i<=26;i++)
 48             f[i]=i;
 49         int p;
 50         for(int i=1;i<=n;i++)
 51         {
 52             int x=s[i][0]-'a'+1,y=s[i][s[i].length()-1]-'a'+1;
 53             chu[x]++;
 54             ru[y]++;
 55             node tmp;
 56             tmp.w=y;
 57             tmp.num=i;
 58             v[x].push_back(tmp);
 59             if(i==1)
 60                 p=x;
 61             f[fnd(y)]=fnd(x);
 62         }
 63         bool flg=0;
 64         int fa=fnd(p);
 65         for(int i=1;i<=26;i++)
 66         {
 67             if(!ru[i]&&!chu[i])
 68                 continue;
 69             if(fnd(i)!=fa)
 70             {
 71                 flg=1;
 72                 break;
 73             }
 74         }
 75         if(flg)
 76         {
 77             printf("***\n");
 78             continue;
 79         }
 80         int st=-1,en=-1,tot=0;
 81         for(int i=1;i<=26;i++)
 82         {
 83             if(!ru[i]&&!chu[i])
 84                 continue;
 85             if(ru[i]!=chu[i])
 86                 tot++;
 87             if(ru[i]==chu[i]-1)
 88                 st=i;
 89             if(ru[i]==chu[i]+1)
 90                 en=i;
 91         }
 92         if(tot&&(tot!=2||en<0||st<0))
 93             printf("***\n");
 94         else
 95         {
 96             if(tot==0)
 97                 st=p;
 98             memset(b,0,sizeof(b));
 99             fluery(st,0);
100             while(!stk.empty())
101             {
102                 int tmp=stk.top();
103                 stk.pop();
104                 cout<<s[tmp];
105                 if(!stk.empty())
106                     printf(".");
107             }
108             printf("\n");
109         }
110     }
111     return 0;
112 }
113  

 

posted @ 2019-04-17 16:17  Fi  阅读(107)  评论(0编辑  收藏  举报