Time Limit: 5000MS | Memory Limit: 128000K | |
Total Submissions: 34372 | Accepted: 8976 |
Description
Input
Output
Sample Input
blue red red violet cyan blue blue magenta magenta cyan
Sample Output
Possible
Hint
Source
分析: 把每个颜色看成一个点,转换成一笔画问题,要用到并查集。
#include <cstdio> #include <string> #include <cstring> #include <cmath> #include <iostream> #define maxnode 1000002 using namespace std; char a[11],b[11]; int d[500002],f[500002],num; int Find(int x) { if(f[x] == x) return x; f[x]=Find(f[x]); return f[x]; } struct trie { int ch[maxnode][26]; int val[maxnode]; int tot; void build() { tot=1; memset(ch[0],0,sizeof(ch[0])); } int idx(char c) { return c-'a'; } int insert(char s[11]) { int u=0,n=strlen(s); for(int i=0;i < n;i++) { int c=idx(s[i]); if(!ch[u][c]) { memset(ch[tot],0,sizeof(ch[tot])); val[tot]=0; ch[u][c]=tot++; } u=ch[u][c]; } if(val[u] == 0) val[u]=++num; d[val[u]]++; return val[u]; } } tree; int main() { tree.build(); for(int i=1;i <= 500001;i++) f[i]=i; while(~scanf("%s %s",a,b)) { f[Find(tree.insert(a))]=Find(tree.insert(b)); } for(int i=2;i <= num;i++) if(Find(i) != Find(1)) { printf("Impossible\n"); return 0; } int now=0; for(int i=1;i <= num;i++) if(d[i] & 1 == 1) now++; if(now == 0 || now == 2) printf("Possible\n"); else printf("Impossible\n"); }