题意:
很明显是一个无向图欧拉路径。
分析:
由于这个题常数有大,所以不能用map,
因此要用hash或者字典树进行标号。
并查集判联通
#include<cstdio>
#include<map>
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=500010;
int du[maxn];
int fa[maxn];
struct node{
int id;
node *next[26];
node(){
id=-1;
for(int i=0;i<26;i++){
next[i]=NULL;
}
}
}*root;
int cnt;
int tree_insert(char s[]){
int i,j;
node *p=root;
int len=strlen(s);
for(int i=0;i<len;i++){
if(p->next[s[i]-'a']==NULL){
p->next[s[i]-'a']=new node;
}
p=p->next[s[i]-'a'];
}
if(p->id==-1) p->id=++cnt;
return p->id;
}
int find(int x){
return fa[x]==x?x:fa[x]=find(fa[x]);
}
int main(){
char str1[20],str2[20];
cnt=0;
for(int i=0;i<maxn;i++){
fa[i]=i;
}
root=new node;
while(scanf("%s%s",str1,str2)!=EOF){
int u=tree_insert(str1);
int v=tree_insert(str2);
int fu=find(u);
int fv=find(v);
if(fu!=fv){
fa[fu]=fv;
}
du[u]++;du[v]++;
}
int num=0;
for(int i=1;i<=cnt;i++){
if(fa[i]==i) num++;
}
if(num>1){
printf("Impossible\n");
return 0;
}
else{
num=0;
for(int i=1;i<=cnt;i++){
if(du[i]&1){
num++;
}
}
if(num==0||num==2) {
printf("Possible\n");
}else{
printf("Impossible\n");
}
}
return 0;
}