AtCoder Beginner Contest 399-e

news/2025/4/2 10:35:09/文章来源:https://www.cnblogs.com/CMY2013/p/18803063

原题链接

看到这道题,我们很容易想到这道题。是的,这道题我们也是将原问题转换成图上问题,将\(s\)字符串中每一个点和\(t\)字符串中所对应的的点之间的关系看成一条有向边,则这个问题就转换成了在一个图上找到一共有几条边,但是这里我们需要注意一个地方,就是如果图中有环,则有几个环我们就要给答案加几(因为如果有环,就不能直接交换,需要将其中一个节点赋成一个新的且没有用过的节点,这样才能保证可以成功交换,而每次赋值都要浪费一次机会,所以最后要给答案加一),这里我们还需要注意一个地方,就是如果图中有基环树(不会基环树的详见这里),就算有环,也不能给答案加一。
因为找到基环树中入度为\(2\)的节点,将它一个在环上的子节点的值改成另一个不在环上的子节点的值,其它点就按正常的方法赋值,这样的话并没有新建节点(因为父节点的两个子节点可以一起赋值,并不用新建节点或者增加步骤),也就不用给答案加一了。注意好所有细节后,我们就可以愉快的写代码了。

CODE

#include<bits/stdc++.h>
using namespace std;
int n,yb[30],fa[30],gs[30],ans=0;
string s,t;
map<char,bool> mp;
bool f[30],fl[30]; 
int main()
{memset(yb,-1,sizeof(yb));memset(fa,-1,sizeof(fa));cin>>n>>s>>t;if(s==t) //特判{cout<<0;return 0;}for(int i=0;i<n;i++){if(yb[s[i]-'a']!=-1 && yb[s[i]-'a']!=t[i]-'a') //如果s字符串中两个相同字符所对应的字符不同,则无论怎么交换,都不可能满足条件{cout<<-1;return 0;}if(yb[s[i]-'a']==-1){yb[s[i]-'a']=t[i]-'a'; //赋值if(s[i]!=t[i]) fa[s[i]-'a']=t[i]-'a',gs[t[i]-'a']++; //建图}mp[t[i]]=true;}for(int i=0;i<26;i++) {if(fa[i]!=i && fa[i]!=-1) ans++; //边的个数}if(mp.size()==26) //特判,因为s中的字符种类一定大于t中的字符种类(若没有,则在上面的特判中就被特判掉了),所以若t中的字符种类满了,且s不等于t,则说明图中存在许多环,且都不是基环树,所以不可能出现新的字符来进行替换,所以不可能。{cout<<-1<<endl;return 0;}for(int i=0;i<26;i++){if(gs[i]>=2) //判断基环树(g代表着每个点的入度){if(!f[i]){int u=i;while(u!=-1){if(f[u]) break;f[u]=true; //标记u=fa[u];} }}}for(int i=0;i<26;i++){if(!f[i]) //统计环的个数{ memset(fl,false,sizeof(fl));int u=i;while(u!=-1){if(f[u]){if(fl[u]) ans++; //累加答案break;}f[u]=fl[u]=true;u=fa[u];} }}cout<<ans;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/908843.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MarkDwon语法

MarkDown语法 1、标题用法 一级标题:#+空格+内容+回车 二级标题:##+空格+内容+回车 三级标题:###+空格+内容+回车 四级标题:####+空格+内容+回车 2、字体用法 粗体使用:快捷键ctrl+b或者内容两边加两个星号,示例 斜体使用:内容两边加一个星号,示例 斜体加粗:内容两边加…

图论(连通分量)

AT_abc284_c [ABC284C] Count Connected Components 题目描述 頂点に $ 1 $ から $ N $ の番号が、辺に $ 1 $ から $ M $ の番号がついた $ N $ 頂点 $ M $ 辺の単純無向グラフが与えられます。辺 $ i $ は頂点 $ u_i $ と頂点 $ v_i $ を結んでいます。 グラフに含まれる連結…

业务系统基础框架-Winform版-角色

角色列表,可刷新,可展开,可折叠编辑角色为角色权限为角色分配菜单查看拥有此角色的账号

3.31 学习记录

实现了使用springboot从文件中读取数据显示在前端

记一次GC导致线上服务超时问题

1、现象2024-12-28 23点左右,线上其他服务请求 content-cache 出现批量超时。content-cache-03 机器内存使用率如下:机器配置:4核8G这里因为JVM参数设置为:-Xms4g -Xmx4g -XX:MaxNewSize=1g所以达到42%时,内存的使用率已经达到了3.3G。 2、数据查看GC日志如下: (1)CMS老…

No.1 可视化大屏--vite+vue3项目环境搭建

一、DataV-Vue3 1.1 安装 官网:https://datav-vue3.netlify.app/Guide/Guide.htmlnpm install @kjgl77/datav-vue3 一、vite3构建Vue3项目 1.1 什么是Vite 1.2创建vite3项目 第一步:新建一个项目的文件夹第二步:输入cmd,回车 第三步: npm init vite 第四步:输入项目名称…

SvelteKit 最新中文文档教程(16)—— Service workers

前言 Svelte,一个语法简洁、入门容易,面向未来的前端框架。 从 Svelte 诞生之初,就备受开发者的喜爱,根据统计,从 2019 年到 2024 年,连续 6 年一直是开发者最感兴趣的前端框架 No.1:Svelte 以其独特的编译时优化机制著称,具有轻量级、高性能、易上手等特性,非常适合构…

OLLAMA 自定义大模型角色

在Ollama中通过deepseek-r1生成特定角色的模板(如教案设计),核心是通过Modelfile定义模型的系统提示(SYSTEM)和对话模板(TEMPLATE)。以下是具体步骤和示例: 一、Modelfile 基本结构与关键指令FROM指令指定基础模型,这里你可以使用ollama本地下载的模型,也可以去Huggi…

WebSocket调试神器对决:Apipost凭何碾压Apifox?

你以为所有API工具都能玩转WebSocket? 当你的APP需要实时股票行情推送,当你的游戏要处理千人同屏交互,当你的IM系统必须保障消息零延迟——传统HTTP协议的"一问一答"模式瞬间破功。此刻WebSocket协议才是真正的救世主,这个全双工通信协议能让客户端与服务器建立&…

一年前的无心之举,一年后我想要将其做的更好——公众号开通。

大家好,答应的事情要做到。 我是晚秋,我在这里,这是我的公众号。 一年前我想把学过的技术,解决得问题都记录下来,帮助更多的人。 日复一日,也放弃过。 但是到今日,忽然看到自己的无心之举帮助了很多刚进入技术这一行的人。 他们迷茫,他们困顿,正如当初的我一样。 谢谢…

用户头像呼吸光环+鼠标悬停旋转放大

用户头像呼吸光环+鼠标悬停旋转放大在 子比主题后台 – 自定义代码 – 自定 CSS 样式代码 里面添加下面代码: /*【用户头像呼吸光环+鼠标悬停旋转放大】开始 */ .avatar{border-radius: 50%; animation: light 4s ease-in-out infinite; transition: 0.5s;}.avatar:hover{tran…