字典树,tries。。这个是指针版。。。
用并查集判断是否全都在一个集合,之后判断欧拉回路。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1e6+5;
int pa[maxn];
inline int find(int x){return pa[x]!=x? pa[x]=find(pa[x]) : x;}
inline void unite(int a,int b){int x1=find(a),x2=find(b);if(x1!=x2){pa[x1]=x2;}}
int deg[maxn],number=0;
struct Node
{
Node *next[30];//0~25
int id;
bool ed;
Node()
{
id = 0, ed = false;
for(int i=0;i<26;i++)next[i]=NULL;
}
}*root;
int insert(char *s)
{
int n=strlen(s);
Node* p=root;
for(int i=0;i<n;i++)
{
int ids = s[i]-'a';
if(p->next[ids]==NULL)
{
p->next[ids] = new Node();
}
p=p->next[ids];
}
if(p->ed)return p->id;
else
{
p->ed = true;
p->id = ++number;
return p->id;
}
}
int main()
{
char a[20],b[20];
root=new Node();
for(int i=1;i<=500000;i++)pa[i]=i;
while(~scanf("%s %s",a,b))
{
int t1=insert(a);
int t2=insert(b);
deg[t1]++, deg[t2]++;
unite(t1,t2);
}
int flag = false;
int x = find(1);
for(int i=2;i<=number;i++)
if(find(i)!=x){flag=true;break;}
int t=0;
for(int i=1;i<=number;i++)
if(deg[i]%2!=0)t++;
if(t!=2 && t!=0)flag=true;
if(flag==1)
cout<<"Impossible"<<endl;
else
cout<<"Possible"<<endl;
return 0;
}