poj 2513
trie+并查集,并查集判断联通情况。
代码:
#include<iostream>
#include<fstream>
using namespace std;
int n;
int f[500001];
int rank[500001];
int d[500001];
void init(){
for(int i=1;i<=500000;i++)
{
f[i]=i;
rank[i]=0;
}
}
int father(int s){
if(s!=f[s])
s=father(f[s]);
return f[s];
}
void unionset(int s,int t){
int i=father(s),j=father(t);
if(rank[i]<rank[j])
{
f[i]=j;
}
else
{
f[j]=i;
if(rank[i]==rank[j])
rank[i]++;
}
}
struct e{
int p[30];
int end;
}tree[5000001];
int state=1;
int build(char c[]){
int i=1,j=0;
for(j=0;j<strlen(c);j++)
{
if(tree[i].p[c[j]-'a']==0)
tree[i].p[c[j]-'a']=++state;
i=tree[i].p[c[j]-'a'];
}
if(tree[i].end==0)
tree[i].end=++n;
return tree[i].end;
}
void read(){
// ifstream cin("in.txt");
int i,j,k,s;
int m=0;
char c[20];
init();
while(scanf("%s",c)!=EOF)
{
i=build(c);
// cin>>c;
scanf("%s",c);
j=build(c);
d[i]++;
d[j]++;
if(i!=j&&father(i)!=father(j))
{
unionset(i,j);
m++;
}
}
if(n==0){
cout<<"Possible"<<endl;
return;
}
if(m!=n-1)
cout<<"Impossible"<<endl;
else
{
k=0;
for(i=1;i<=n;i++)
if(d[i]%2)
{
k++;
if(k>=3)
break;
}
if(i>n)
cout<<"Possible"<<endl;
else
cout<<"Impossible"<<endl;
}
}
int main(){
read();
return 0;
}
浙公网安备 33010602011771号