代码
#include <iostream>
#include <stdio.h>
using namespace std;
#define MAX 27
#define S 500003
struct Node
{
int id;
Node *next[MAX];
};
bool judge_con();
bool judge_fre( );
Node * InitNode();
int fre[S];
int father[S];
int Insert(Node *,char *);
int getfather(int);
int sum=-1;
int main()
{
for(int i=0;i<S;i++)
father[i]=i;
int x;
int y;
Node *head=InitNode();
char a[12];char b[12];
while(cin>>a){ //用while(scanf("%s%s",a,b)!=EOF) 省时间
cin>>b;
x= Insert(head,a);
y= Insert(head,b);
father[getfather(x)]=getfather(y);
fre[x]++;
fre[y]++;
}
if(judge_fre()&&judge_con())
cout<<"Possible";
else cout<<"Impossible";
}
int getfather(int i)
{
if(father[i]!=i)
{
father[i]=getfather(father[i]);
}
return father[i];
}
int Insert(Node * h,char *p)
{
Node * tmp;
tmp=h;
int i=0;
int num;
while(p[i] )
{
num=p[i]-'a';
if(tmp->next[num]!=NULL)
tmp=tmp->next[num];
else {
tmp->next[num]=InitNode();
tmp=tmp->next[num];
}
i++;
}
if(tmp->id==-1)
{sum++; //竟然在这里忘记了括号
tmp->id=sum;
}
return tmp->id;
}
Node * InitNode()
{
Node *p=new Node ;
p->id=-1;
for(int i=0;i<MAX;i++)
p->next[i]=NULL;
return p;
}
bool judge_fre( )
{
int i=0;int k=0;
for(i=0;i<=sum;i++)
if(fre[i]%2!=0)
k++;
if(k==0||k==2)
return true;
else return false;
}
bool judge_con()
{
int j=0;
int x=getfather(0);
for( j=0;j<=sum;j++)
if(getfather(j)!=x)
break;
if(j==sum+1)
return true ;
else return false;
}
这题 开始 RE 了好多回 后来才发现是数组开小了 才导致指针越界 还是应该仔细看题 S开始弄成了250003
此题做法是 字典树+并查集 就是一个hash映射问题