| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:test dataIn Reply To:Re:test data Posted by:swust20105376 at 2012-07-14 13:37:59 > 这上面的我都过了,为什么还RE???
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<stack>
#include<cstdlib>
using namespace std;
const int N=30;
const int Max=10010;
struct node
{
int to,id;
};
vector<node>v[N];
stack<int>sta;
int fa[N],n;
bool u[Max];
string s[Max];
int find(int x)
{
if(fa[x]!=x)return fa[x]=find(fa[x]);
return fa[x];
}
bool dfs(int x,int cnt)
{
int i;
if(cnt==n)return true;
for(i=0;i<v[x].size();i++)
{
node t=v[x][i];
if(u[t.id]==0)
{
u[t.id]=1;
if(dfs(t.to,cnt+1))
{
sta.push(t.id);
return true;
}
u[t.id]=0;
}
}
return false;
}
void get_ans()
{
int t=sta.top();
sta.pop(); //printf("%d ",t);
cout<<s[t];
while(!sta.empty())
{
t=sta.top(); //printf("%d ",t);
sta.pop();
cout<<"."<<s[t];
}
printf("\n");
// for(int i=0;i<n;i++)printf("%s ",s[i]);
return;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int i,j,ok[N]={0},out[N]={0},in[N]={0};
scanf("%d",&n);
getchar();
memset(s,0,sizeof(s));
for(i=0;i<26;i++)
{
fa[i]=i;
v[i].clear();
}
for(i=0;i<n;i++)cin>>s[i];
sort(s,s+n);
for(i=0,j=0;i<n;i++)
{
int x=s[i][0]-'a',y=s[i][s[i].size()-1]-'a';
node t={y,j};
v[x].push_back(t);
j+=1;
out[x]+=1,in[y]+=1;
ok[x]=ok[y]=1;
x=find(x),y=find(y);
if(x!=y)fa[y]=x;
}
int cnt=0,num=0,flag=0,a[10];
for(i=0;i<26;i++)
{
if(ok[i])
{
if(in[i]!=out[i])a[num++]=i;
if(fa[i]==i)cnt+=1;
if(cnt>1||num>2)
{
flag=1;
break;
}
}
}
for(i=0;i<n;i++)cout<<s[i]<<" ";
printf("\n");
if(flag)printf("***\n");
else
{
memset(u,0,sizeof(u));
if(num==0)
{
for(i=0;i<26;i++)
{
if(ok[i]&&dfs(i,0))get_ans();
}
}
else if(num==2)
{
if(out[a[0]]-in[a[0]]==1&&in[a[1]]-out[a[1]]==1&&dfs(a[0],0))get_ans();
else if(out[a[1]]-in[a[1]]==1&&in[a[0]]-out[a[0]]==1&&dfs(a[1],0))get_ans();
else printf("***\n");
//for(i=0;i<v['t'-'a'].size();i++)printf("%d ",v['t'-'a'][i].to);
}
else printf("***\n");
}
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator