[洛谷2814]家谱
思路:
字符串哈希,然后用普通的并查集维护即可。
1 #include<cstdio> 2 #include<cctype> 3 #include<cstring> 4 const int mod=19260817; 5 char name[mod][7]; 6 inline int hash(char *s) { 7 int n=strlen(s),ret=0; 8 for(int i=0;i<n;i++) { 9 ret=(ret*26+tolower(s[i])-'a')%mod; 10 } 11 strcpy(name[ret],s); 12 return ret; 13 } 14 class DisjointSet { 15 private: 16 int anc[mod]; 17 public: 18 DisjointSet() { 19 for(int i=0;i<mod;i++) anc[i]=i; 20 } 21 int Find(const int x) { 22 return x==anc[x]?x:anc[x]=Find(anc[x]); 23 } 24 void Union(const int x,const int y) { 25 anc[Find(x)]=Find(y); 26 } 27 }; 28 DisjointSet s; 29 int main() { 30 int par; 31 char c,str[8]; 32 while(~scanf("%s",str)) { 33 c=str[0]; 34 for(int i=0;i<7;i++) { 35 str[i]=str[i+1]; 36 } 37 if(c=='#') { 38 par=hash(str); 39 } 40 if(c=='+') { 41 s.Union(hash(str),par); 42 } 43 if(c=='?') { 44 printf("%s %s\n",str,name[s.Find(hash(str))]); 45 } 46 if(c=='$') break; 47 } 48 return 0; 49 }