#include <stdio.h> #include <stdlib.h> #include <string.h> #define maxn 50010 struct node{ char name[10]; }A[maxn]; int n; int f[maxn]; int hash_val(char str[]){ int i; for(i = 1;i <= n; i++){ if(strcmp(str,A[i].name)==0)return i; } return 0; } int find(int v){ if(f[v]==v)return v; int F = find(f[v]); f[v] = F; return F; } int main() { n = 0; char temp[10]; int last; for(int i = 1;i <= 50001; i++){ f[i] = i; } while(scanf("%s",temp) && strcmp(temp,"$") != 0){ char str[10]; strcpy(str,&temp[1]); int index = hash_val(str); if(temp[0]=='#'){ if(!index){ strcpy(A[++n].name,str); last = n; } else{ last = index; } } if(temp[0]=='+'){ int now; if(!index){ strcpy(A[++n].name,str); now = n; } else{ now = index; } int fa = find(last); int fb = find(now); f[fb] = fa; } if(temp[0]=='?'){ int v = hash_val(str); int fv = find(v); printf("%s %s\n",str,A[fv].name); } } return 0; } /************************************************************** Problem: 2236 User: admin Language: C Result: Accepted Time:685 ms Memory:1828 kb ****************************************************************/