题意:给你n根木棒,每个木棒两端都涂有颜色,任意两根木棒可以连在一起,如果他们有一端颜色是相同的,问你最后是否能把所有的木棒连成一根。
题解:神奇的trie &欧拉回路(用map水的TLE了)
注:COPY的题解,第一见识trie &学习了结构体定义时初始化 &一些新的函数(new开辟类型新空间,要访问new所开辟的结构体空间,无法直接通过变量名进行,只能通过赋值的指针进行访问.)
#define INF 0x7fffffff
#define eps (1e-9)
#define clearto(s,x) memset(s,x,sizeof(s))
using namespace std;
typedef long long llong;
int n,m,tot=0;
int du[500009],fa[500009];
char a[15],b[15];
struct trie{
int id; bool end; trie *next[26];
trie()
{ id =-1; end =0; for(int i=0;i<26;i++) next[i] =NULL; }
} *root;
int getid(char *s){
trie *tmp =root;
for(int i=0;i<strlen(s);i++){
if(tmp->next[s[i]-97] ==NULL)
{ tmp->next[s[i]-97] =new trie; }
tmp =tmp->next[s[i]-97];
}
if(tmp->end) return tmp->id;
tmp->end =true; tmp->id =tot; tot++;
return tmp->id;
}
int find(int x){
if(fa[x]!=x) fa[x] =find(fa[x]); return fa[x];
}
void link(int x,int y) { fa[find(x)] = fa[find(y)]; }
int main()
{
//freopen("D:\data.txt","r",stdin);
int TT,i,k,t=0;
root = new trie; clearto(du,0);
for(i=0;i<500005;i++) fa[i] =i;
while(scanf("%s %s",a,b)!=EOF)
{
int x = getid(a), y = getid(b);
du[x]++; du[y]++; link(x,y);
}
int old =0;
for(i=0;i<tot;i++) if(du[i]&1) old++;
int f =find(1);
for(i=0;i<tot;i++) if(find(i)!=f) { old=-1; break; }
printf("%s",(old==0||old==2)? "Possible":"Impossible");
return 0;
}