Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
第一次Trie还是链表构造,成就感~#include <iostream> #include <cstring> using namespace std; int lst,num,l,m,n1,n2,tag,f1,f2,tmp; #define mxn 5200001 //trie末尾lst,单词编号num,单词长度l, 单词数m int tr[mxn];//第一个子节点的编号 int n[mxn];//单词序号 int w[mxn];//w[i]表示i位子木为w[i] int nxt[mxn];//连接同一邻接父节点的下一个兄弟节点 int f[mxn/10+1];//父亲标识 int d[mxn/10+1]; char s1[25],s2[25],now[25]; void insert(int x,int p) { if (p==l) { if (n[x]==0) n[x]=++m; num=n[x]; return; } tag=now[p]-'a'+1;//当前查找字母 if (tr[x]==0) { tr[x]=++lst; w[lst]=tag; insert(lst,p+1); } else { tmp=tr[x]; while (nxt[tmp]!=0&&w[tmp]!=tag) tmp=nxt[tmp]; if (w[tmp]==tag) insert(tmp,p+1); else { nxt[tmp]=++lst; w[lst]=tag; insert(lst,p+1); } } } bool check() { int root=0,c=0; for (int i=1;i<=m;i++) { int ex=f[i]; while (f[ex]!=ex) ex=f[ex]; if (d[i]&1)c++; if (root==0||root==ex) root=ex; else return false; } return (c==0||c==2); } int main() { memset(f,0,sizeof(f)); memset(tr,0,sizeof(tr)); memset(n,0,sizeof(n)); memset(nxt,0,sizeof(nxt)); memset(w,0,sizeof(w)); memset(d,0,sizeof(d)); lst=m=0; for (int i=1;i<=mxn/10;i++) f[i]=i; while (scanf("%s%s",s1,s2)!=EOF) { strcpy(now,s1); l=strlen(s1); insert(0,0); n1=num; strcpy(now,s2); l=strlen(s2); insert(0,0); n2=num; d[n1]++;d[n2]++; while (f[n1]!=n1) n1=f[n1]; while (f[n2]!=n2) n2=f[n2]; f[n2]=n1; } if (check())cout<<"Possible\n"; else cout<<"Impossible\n"; return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator