Luogu [P2814] 家谱

本文介绍了一种使用STL map和并查集处理字符串间关系的算法,避免了hash冲突和整数转换的问题,直接采用字符串进行并查集操作,简化了实现过程。

题目链接

这个题不难,但是有点小小坑。

首先并查集肯定能看出来。

然后字符串的话,一开始我想用 hash 来处理,但想了想,离散化不好搞,人也太多了,一不小心就hash重了,还是算了。

然后就想到了STL 的 map :

  我一开始先用 map 讲人名转化为 数字 来并查集,结果写到最后发现还得将 数字 转化为 人名 输出,得再开一个 map 。这还没啥,最主要的是我发现int转string时不好存,不好输出,只好放弃。

  然后一想,没必要转化为int型并查集,直接用string并查集就完事了。

代码:

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <map>
using namespace std;
map <string,string> p;//思路重点
string find(string x){//直接string并查集,连fa数组都不用开
    if(x!=p[x]) 
        p[x]=find(p[x]);
    return p[x];
}
string s,s1;//s1记录当前的father 
int main(){
    register char ch;
    cin>>ch;
    while(ch!='$'){
        cin>>s;
        if(ch=='#'){
            s1=s;
            if(p[s]=="")
                p[s]=s;
        }
        else if(ch=='+')
            p[s]=s1;
        else 
            cout<<s<<' '<<find(s)<<endl;    
        cin>>ch;
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/qiuchengrui/p/11012849.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值