//TRIE + 並查集 + 歐拉迴路<br />//A了這道題,學會了用並查集判斷無向圖的連通性<br />#include<iostream><br />#include<map><br />#include<string><br />using namespace std;<br />const int MAX = 500003;<br />int N;<br />int fa[MAX];<br />int deg[MAX];<br />struct trie<br />{<br />int color;<br />trie *next[26];<br />trie()<br />{<br />color = 0;<br />memset(next,0,sizeof(next));<br />}<br />}*root;<br />int insert(trie *p,char str[])<br />{<br />for(int i = 0;i < strlen(str);++i)<br />{<br />int s = str[i] - 'a';<br />if(p->next[s] == NULL)<br />p->next[s] = new trie;<br />p = p->next[s];<br />if(i == strlen(str) - 1)<br />{<br />if(p->color == 0)<br />p->color = ++N;<br />++deg[p->color];<br />return p->color;<br />}<br />}<br />}<br />void init()<br />{<br />for(int i = 1;i <= MAX;++i)<br />fa[i] = i;<br />}<br />int Find(int x)<br />{<br />if(x == fa[x])return x;<br />else return fa[x] = Find(fa[x]);<br />}<br />void Union(int x,int y)<br />{<br />x = Find(x);<br />y = Find(y);<br />fa[x] = y;<br />}<br />bool isConnected()<br />{<br />for(int i = 2;i <= N;++i)<br />if(Find(i) != Find(i-1))return false;<br />return true;<br />}<br />int main()<br />{<br />//freopen("in.txt","r",stdin);<br />char c1[11],c2[11];<br />bool ok = 1;<br />int x,y,oddDeg = 0;<br />N = 0;<br />root = new trie;<br />memset(deg,0,sizeof(deg));<br />init();<br />while(scanf("%s%s",c1,c2) != EOF)<br />{<br />x = insert(root,c1);<br />y = insert(root,c2);<br />Union(x,y);<br />}<br />if(!isConnected())<br />{<br />printf("Impossible/n");<br />return 0;<br />}<br />for(int i = 1;i <= N;++i)<br />{<br />if(deg[i] % 2 != 0)++oddDeg;<br />if(oddDeg > 2)<br />{<br />printf("Impossible/n");<br />return 0;<br />}<br />}<br />printf("Possible/n");<br />return 0;<br />}