题目大意:给一些彩色棒,看能不能组成一个
解决:trie+无向图欧拉路(偶数结点度数为0或者2)
clude <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
struct node
{
int next[26];
int wordNo;
};
int top;
int num;
node tree[2000000];
short adj[510010];
int data[510010];
void init()
{
top=1;
num=0;
memset(data,-1,sizeof(data));
memset(tree[0].next,0,sizeof(tree[0].next));
tree[1].wordNo=-1;
}
int build_trie(char *str)
{
int id,i=0;
while(*str)
{
id=*str-'a';
if(tree[i].next[id]==0)
{
tree[i].next[id]=top;
tree[top].wordNo=-1;
memset(tree[top].next,0,sizeof(tree[top].next));
top++;
}
i=tree[i].next[id];
str++;
}
if(tree[i].wordNo == -1)tree[i].wordNo=num++;
return tree[i].wordNo;
}
int find(int x)
{
if(data[x]<0)return x;
return data[x]=find(data[x]);
}
void merge(int a,int b)
{
int fa=find(a);
int fb=find(b);
if(fa==fb)return ;
int t=data[fa]+data[fb];
if(fa>fb){data[fa]=fb;data[fb]=t;}
else {data[fb]=fa;data[fa]=t;}
}
int main()
{
int i,n,beg,end;
char s1[15],s2[15];
init();
while(scanf("%s%s",s1,s2)!=EOF)
{//并查集判断联通性,trie求编号
beg=build_trie(s1);
end=build_trie(s2);
adj[beg]++;
adj[end]++;
merge(beg,end);
}
int root=0,tot=0;
bool flag=0;
for(i=0;i<num ;i++)
{
if(data[i]<0)
{
root++;
if(root>1){flag=1;break;}
}
if(adj[i]&1)
{
tot++;
if(tot>2){flag=1;break;}
}
}//判断是否存在无向图的欧拉路
if(!flag && (tot==0 || tot==2))puts("Possible");
else puts("Impossible");
return 0;
}
浙公网安备 33010602011771号