poj2513_欧拉通路+并查集+hash/trie

这找了很多解题报告,都是用trie做的,有一些还干脆否定了hash,本人偏偏不信这个邪,用hash做。。。

hash代码:

#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn=500005; int degree[maxn]; int p[maxn]; int find_p(int x) { while(x!=p[x]) x=p[x]; return x; } void union_p(int x,int y) { if(find_p(x)==0) p[x]=x; if(find_p(y)==0) p[y]=y; p[find_p(x)]=find_p(y); } int hash_index(char s[]) { int hash=1; int len=strlen(s); for(int i=0;i<len;i++) hash=(hash*29+s[i]-'a')%maxn; return hash; } int main() { // freopen("in","r",stdin); char a[11],b[11]; int i,j; for(i=0;i<maxn;i++) { degree[i]=0; p[i]=0; } int n1,n2; while(scanf("%s%s",a,b)!=EOF) { n1=hash_index(a); n2=hash_index(b); degree[n1]++; degree[n2]++; union_p(n1,n2); } int sum=0; for(i=1;i<maxn;i++) { if(degree[i]%2) sum++; if(sum>2) { printf("Impossible/n"); return 0; } } i=1; while(i<maxn&&find_p(i)==0) i++; int flag=find_p(i); for(;i<maxn;i++) { int x=find_p(i); if(x&&x!=flag) { printf("Impossible/n"); return 0; } } printf("Possible/n"); return 0; }

 

用trie树做:

#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn=500005; int degree[maxn]; int p[maxn]; int num; struct node { int id; node *next[26]; node () { id=-1; for(int i=0;i<26;i++) next[i]=NULL; } }*root; int find_p(int x) { while(p[x]!=x) x=p[x]; return x; } void merge(int x,int y) { p[find_p(x)]=find_p(y); } int insert(char s[]) { int i,j; node *p=root; int len=strlen(s); for(i=0;i<len;i++) { if(p->next[s[i]-'a']==NULL) p->next[s[i]-'a']=new node; p=p->next[s[i]-'a']; } if(p->id==-1) p->id=num++; return p->id; } int main() { // freopen("in","r",stdin); num=0; root=new node; char a[11],b[11]; int id1,id2; int i; for(i=0;i<maxn;i++) { degree[i]=0; p[i]=i; } while(scanf("%s%s",a,b)!=EOF) { id1=insert(a); id2=insert(b); degree[id1]++; degree[id2]++; merge(id1,id2); } int sum=0; int flag=find_p(0); for(i=0;i<num;i++) { if(degree[i]%2) sum++; if(sum>2||flag!=find_p(i)) { printf("Impossible/n"); return 0; } } printf("Possible/n"); return 0; }

你可能感兴趣的:(null,insert,merge,n2)