1 条题解

  • 0
    @ 2024-12-24 10:06:02

    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
    上传者