1 条题解
-
0
C :
#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; }
C++ :
#include <iostream> #include <cstring> #include <cstdio> using namespace std; #define NMAX 50002 struct tagPerson { char m_name[7]; int m_father; } Person[NMAX]; int g_nPeople = 0; void InitData(); int FindAncestor(const char szName[]); int AddPerson(const char szName[]); int CheckPerson(const char szName[]); int main() { InitData(); return 0; } void InitData() { char szName[8] = "\0"; int nFather = 0; char chFlag = '\0'; cin >>szName; chFlag = szName[0]; while (chFlag != '$') { if (chFlag == '#') { nFather = FindAncestor(szName + 1); cin >>szName; chFlag = szName[0]; while (chFlag == '+') { int father = CheckPerson(szName + 1); if (father == -1) { father = AddPerson(szName + 1); } Person[father].m_father = nFather; cin >>szName; chFlag = szName[0]; } } if (chFlag == '?') { nFather = FindAncestor(szName + 1); cout <<szName+1 <<' ' <<Person[nFather].m_name <<endl; cin >>szName; chFlag = szName[0]; } } } int FindAncestor(const char szName[]) { int nFather = CheckPerson(szName); if (nFather == -1) { nFather = AddPerson(szName); } else { while (Person[nFather].m_father != nFather) { nFather = Person[nFather].m_father; } } return nFather; } int AddPerson(const char szName[]) { Person[g_nPeople].m_father = g_nPeople; strcpy(Person[g_nPeople].m_name, szName); ++g_nPeople; return g_nPeople - 1; } int CheckPerson(const char szName[]) { for (int i = 0; i < g_nPeople; ++i) { if (strcmp(szName, Person[i].m_name) == 0) { return i; } } return -1; }
- 1
信息
- ID
- 1827
- 时间
- 2000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者