Language:
Colored Sticks
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.
Source |
[Submit] [Go Back] [Status] [Discuss]
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
int color, n;
int pre[500000+5];
int sum[500000+5];
struct node {
node *next[26+5];
bool flag;
int id;
node() {
flag=0;
id=0;
for(int i=0;i<26;i++)
next[i]=NULL;
}
}*root;
int hash(char *s) {
node *p=root;
for(int i=0;s[i]!='\0';i++) {
if(p->next[s[i]-'a']==NULL) {
p->next[s[i]-'a']=new node;
}
p=p->next[s[i]-'a'];
}
if(p->flag) return p->id;
else {
p->flag=1;
p->id=++color;
return p->id;
}
}
int fin(int x) {
int r=x;
while(x!=pre[x]) {
x=pre[x];
}
while(r!=x) {
int y=pre[r];
pre[r]=x;
r=y;
}
return x;
}
int main() {
root=new node;
n=color=0;
memset(sum,0,sizeof(sum));
for(int i=1;i<=250000;i++)
pre[i]=i;
char a[10+5], b[10+5], s[20+5];
while(gets(s)&&strlen(s)){
int i, j;
for(i=0;s[i]!=' ';i++)
a[i]=s[i];
a[i]='\0';
for(j=i+1;j<strlen(s);j++) {
b[j-i-1]=s[j];
}
b[j-i-1]='\0';
int num1=hash(a), num2=hash(b);
n=max(num2,max(n,num1));
pre[fin(num1)]=fin(num2);
sum[num1]++;
sum[num2]++;
}
int ans=0;
for(int i=1;i<=n;i++)
if(sum[i]%2) ans++;
if(ans==0||ans==2) {
int i;
int x=fin(1);
for(i=2;i<=n;i++) {
if(fin(i)!=x)
break;
}
if(i>n) cout<<"Possible"<<endl;
else cout<<"Impossible"<<endl;
}
else cout<<"Impossible"<<endl;
}
Language:
Colored Sticks
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.
Source |
[Submit] [Go Back] [Status] [Discuss]
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator