Colored Sticks
Time Limit: 5000MS | Memory Limit: 128000K | |
Total Submissions: 35039 | Accepted: 9155 |
Description
You are given a
bunch
(群) of wooden sticks. Each
endpoint
(端点) of each stick is colored with some color. Is it possible to
align
(结盟) the sticks in a straight line such that the colors of the endpoints that touch are of the same color?
Input
Input
(投入) is a
sequence
(序列) of lines, each line contains two words, separated by spaces, giving the colors of the endpoints of one stick. A word is a sequence of
lowercase
(小写字母) letters no longer than 10 characters. There is no more than 250000 sticks.
Output
If the sticks can be
aligned
(结盟) in the desired way,
output
(输出) a single line saying Possible, otherwise output Impossible.
Sample Input
blue red red violet cyan blue blue magenta magenta cyan
Sample Output
Possible
Hint
Huge input(投入),scanf is recommended.
一个判断有无欧拉路的问题,数据比较大,用到了字典树和并查集。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<new>
using namespace std;
char a[15],b[15];
typedef struct node
{
bool ff;
int num;
struct node * next[28];
}tree;
int cha[551234];
int hs[551234];
int cl=1;
int add(char ch[], tree * root)
{
int len=strlen(ch);
tree * you=root;
for(int i=0;i<len;i++)
{
int tt=ch[i]-'a';
if(you->next[tt]==NULL)
{
you->next[tt]=new tree;
you->next[tt]->ff=false;
for(int i=0;i<=26;i++) you->next[tt]->next[i]=NULL;
}
you=you->next[tt];
}
if(!you->ff)
{
you->ff=true;
you->num=cl++;
}
return you->num;
}
int f(int x)
{
if(!cha[x]) return x;
return cha[x]=f(cha[x]);
}
void he(int c1,int c2)
{
if(c1>c2)
{
int t=c1;
c1=c2;
c2=t;
}
c1=f(c1);
c2=f(c2);
if(c1!=c2) cha[c2]=c1;
}
char A[110];
int main()
{
memset(hs,0,sizeof(hs));
memset(cha,0,sizeof(cha));
tree * root=new tree;
root->ff=false;
for(int i=0;i<=26;i++) root->next[i]=NULL;
while(gets(A)&&A[0]!='\0')
{
sscanf(A,"%s%s",&a,&b);
int c1,c2;
c1=add(a,root); c2=add(b,root);
hs[c1]++;
hs[c2]++;
he(c1,c2);
}
// cout<<"1111";
int dan=0,shu=0;
for(int i=1;i<cl;i++)
{
if(hs[i]%2) dan++;
if(!cha[i]) shu++;
if(shu>1||dan>2) break;
}
// cout<<dan<<" "<<shu<<endl;
if((shu==0&&(dan==0||dan==2))||(shu==1&&(dan==0||dan==2)))
cout<<"Possible"<<endl;
else cout<<"Impossible"<<endl;
return 0;
}