- 通过trie获得该颜色的id
- 用并查集连接两个点,并且记录两个点的度
- 欧拉图:奇度定点为0或2个,并且连通
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxm=1e7+500;
int tot,col,trie[maxm][30],mark[maxm];
int deg[maxm],fa[maxm],res;
char c1[30],c2[30];
int find(int x){
while(x!=fa[x]) x=fa[x]=fa[fa[x]];
return x;
}
int insert(char* str){
int len = strlen(str), rt = 0;
for(int i=0;i<len;i++){
int nx = str[i]-'a';
if(!trie[rt][nx]) trie[rt][nx] = ++tot;
rt = trie[rt][nx];
}
if(mark[rt]) return mark[rt];
else return mark[rt]=++col;
}
int main(){
for(int i=0;i<maxm;i++) fa[i]=i;
while(scanf("%s%s",c1,c2)!=EOF){
int u = insert(c1), v = insert(c2);
deg[u]++, deg[v]++;
fa[find(u)] = find(fa[v]);
}
for(int i=1;i<=col;i++){
if(find(fa[i])!=find(fa[1])) goto out;
if(deg[i]&1) {
res++;
if(res>2) goto out;
}
}
if(!(res==2||res==0)) goto out;
printf("Possible\n");
return 0;
out:;
printf("Impossible\n");
return 0;
}