首页 > 其他分享 >20221113_T1A-_并查集

20221113_T1A-_并查集

时间:2022-11-13 21:56:39浏览次数:45  
标签:重命名 文件名 int 查集 20221113 read fa st1 -_

题意

在一个文件目录下有 \(n\) 个不同的文件,每个文件都有一个文件名,其中第 \(i\) 个文
件的文件名为 \(s_i\)。这些文件名两两不同。
小 C 希望更改一部分文件的文件名,他对于每个文件都拟定了它的目标文件名,
其中第 \(i\) 个文件的目标文件名为 \(t_i\)。同样地,所有目标文件名也是两两不同的。
为了更改文件名,小 C 需要进行若干次的重命名操作。每次重命名,小 C 可以选
一个文件,将其文件名改成任意字符串。不过,重命名要求遵循这样的规则:每次重命
名之后,所有这 \(n\) 个文件的文件名仍应两两不同。
那么,小 C 至少要进行多少次重命名操作,才能使所有文件名都改成相应的目标
文件名呢?

题解

赛时得分:100/100

非常显然,如果遇到了环那么答案就 +1,如果这个环是环是自环那么答案 -1,一条链那么对答案没有影响(意思是交换就行了)。

现在就是怎么判环的问题了。并不难,我们直接并查集,如果查到两个东西本来就在一个集合里了,那么说明有环了。

代码

#include <bits/stdc++.h>
using namespace std;
template <typename T>inline void read(T& t){t=0; register char ch=getchar(); register int fflag=1;while(!('0'<=ch&&ch<='9')) {if(ch=='-') fflag=-1;ch=getchar();}while(('0'<=ch&&ch<='9')){t=t*10+ch-'0'; ch=getchar();} t*=fflag;}
template <typename T,typename... Args> inline void read(T& t, Args&... args) {read(t);read(args...);}
const int N = 1e5 + 10, inf = 0x3f3f3f3f;

int n, cnt, fa[N], ans;
map<string, int>mp;
string st[N], st1[N];
int findf(int x) {
    if(fa[x] == x) return x;
    else return fa[x] = findf(fa[x]);
}

int main() {
    freopen("files.in", "r", stdin);
    freopen("files.out", "w", stdout);
    read(n);
    for(int i = 1; i <= n; ++i) fa[i] = i;
    for(int i = 1; i <= n; ++i) {
        cin >> st[i] >> st1[i];
        if(!mp.count(st1[i])) mp[st1[i]] = i;
    }
    for(int i = 1; i <= n; ++i) {
        if(st[i] == st1[i]) {
            --ans;
            continue;
        }
        if(mp.count(st[i])) {
            int k = i, l = mp[st[i]];
            if(findf(k) == findf(l)) {
                // cout << k << ' ' << l << endl;
                ++ans;
            } else fa[findf(l)] = findf(k);
        }
    }
    cout << ans + n << endl;
    return 0;
}

标签:重命名,文件名,int,查集,20221113,read,fa,st1,-_
From: https://www.cnblogs.com/Mercury-City/p/16887090.html

相关文章

  • 数据结构--栈
    --栈#规则:先进后出,只能对栈顶进行操作#应用:浏览器的返回 实现方式一以列表尾部作为栈的顶端classStack():def__init__(self):self.items=[]de......
  • 进程间通信-信号-pipe-fifo
    进程间通信-信号-pipe-fifopipepipe只能用于有血缘关系的进程进行单向通信。调用pipe函数时在内核中开辟一块缓冲区(称为管道)用于通信,它有一个读端一个写端,然后通过fd......
  • sh: vue-cli-service: command not found
    mac环境下运行vue项目报错sh:vue-cli-service:commandnotfound解决方法:cd到项目目录下,执行命令sudorm-rfnode_modulespackage-lock.json&&npminstall然后根......
  • 读者-写者(多线程)
    读者-写者(多线程)0推荐在openEuer上实现1描述操作系统中“读者-写者”问题,理解问题的本质,提交你理解或查找到的文本资料2利用多线程完成reader和writer3在main中测......
  • bugku-No one knows regex better than me
    难得开靶场所需要的金币,比完成题目给的少题目源码<?phperror_reporting(0);$zero=$_REQUEST['zero'];$first=$_REQUEST['first'];$second=$zero.$first;if(preg_......
  • 47.vue-router的钩子函数
    钩子函数就是路由导航守卫;有7个守卫,分为3类;全局守卫:在全部的组件生效;beforeEach全局前置守卫afterEach全局后置守卫 解析守卫......
  • L10U5-2-Finding a solution to a problem
    L10U5-2-FindingasolutiontoaproblemReadingBrainstormingtipsReadthetextaboutbrainstormingtipsandanswerthequestions.BrainstormingtipsBrainsto......
  • 46.使用过vuex和vue-router吗
    使用过,vuex是状态管理工具,它的数据可以被所有的组件获取,方法可以被所有的组件调用;vuex 的内部的运行机制:state提供了数据驱动视图,dispath派发actions执行异步操作,comm......
  • ERC721开发NFT--接口
    使用https://docs.openzeppelin.com/contracts/4.x/erc721中的简单案例pragmasolidity^0.8.0;import"@openzeppelin/contracts/token/ERC721/extensions/ERC721U......
  • 解决“fast-forward, aborting”问题
    1.现象对某一个远程仓库gitpull过程中,报错如下:#zl@srv123in~/git/radxa/kernel[14:09:54]$gitpullremote:Enumeratingobjects:5,done.remote:Cou......