当前位置: 首页 > news >正文

abc Replace

洛谷AT_abc399_e [ABC399E] Replace

洛谷题目传送门

题目描述

给定一个正整数 NNN 以及两个长度为 NNN 的小写英文字母字符串 SSSTTT
请判断是否可以通过重复以下操作(允许 0 次操作)将 SSS 变为 TTT。若可能,还需输出所需的最小操作次数。

操作
选择两个小写英文字母 xxxyyy,将 SSS所有 出现的 xxx 替换为 yyy

输入格式

输入通过标准输入给出,格式如下:

NNN
SSS
TTT

输出格式

若可以将 SSS 变为 TTT,则输出所需的最小操作次数;否则输出 −1-11

输入输出样例 #1

输入 #1

6
afbfda
bkckbb

输出 #1

4

输入输出样例 #2

输入 #2

4
abac
abac

输出 #2

0

输入输出样例 #3

输入 #3

4
abac
abrc

输出 #3

-1

输入输出样例 #4

输入 #4

4
abac
bcba

输出 #4

4

说明/提示

约束条件

  • 1≤N≤2×1051 \leq N \leq 2 \times 10^51N2×105
  • NNN 为整数
  • SSSTTT 均为长度为 NNN 的小写英文字母字符串

样例解释 1

通过以下 4 次操作可将 SSS 变为 TTT

  1. 选择 x=x=x= b, y=y=y= c,操作后 S=S=S= afcfda
  2. 选择 x=x=x= a, y=y=y= b,操作后 S=S=S= bfcfdb
  3. 选择 x=x=x= f, y=y=y= k,操作后 S=S=S= bkckdb
  4. 选择 x=x=x= d, y=y=y= b,操作后 S=S=S= bkckbb(与 TTT 一致)

由于无法在 3 次或更少操作内完成,最小操作次数为 4。

样例解释 2

SSSTTT 初始时已一致,无需任何操作。

样例解释 3

无论如何操作,都无法将 SSS 变为 TTT

思路引入

我们将样例1转换为字符的改变,即可得到如下的图:
在这里插入图片描述
我们只需按箭头反方向改变即可,但这对这道题没有影响。
再看看样例4:
在这里插入图片描述
我们发现他形成了一个环,那是否就无解了呢???不,我们可以使用一个其他的字母来打破环。但是注意要多改一次。

思路详解

通过上面的画图我们发现一下的结论:

  1. 每个字母至多转化为另外1个字母,否则无解。
  2. 每个字母只要会转换就会产生1的贡献。
  3. 每个环将会额外产生1的贡献。

但是我们要注意,一个环需要一个空闲字母或一个链首(入度为0)的字母才能打破,所以没有这些字母又有环依旧无解。

现在代码已经很显然了,具体如下。

code

#include<bits/stdc++.h>
using namespace std;
const int N=4e5+5;
int n;
string s,t;
int nxt[35],in[35];
int vis[35];
void dfs(int u){//深搜标记if(vis[u])return;vis[u]=1;if(nxt[u]!=-1)dfs(nxt[u]);
}
int flag=0;//有无字母可以打破环
int ans=0;
int main(){cin>>n>>s>>t;memset(nxt,-1,sizeof(nxt));//nxt==-1代表当前字母不变for(int i=0;i<n;i++){int x=s[i]-'a',y=t[i]-'a';if(nxt[x]==-1)nxt[x]=y;else if(nxt[x]!=y){//一个字母至多变为另一个字母cout<<-1;return 0;}}for(int i=0;i<26;i++){if(nxt[i]!=-1){//统计入度,找到链头in[nxt[i]]++;ans+=(nxt[i]!=i);//有可能有自环,判断一下}}for(int i=0;i<26;i++){if(nxt[i]==-1||in[i]==0)flag=1;}for(int i=0;i<26;i++){//标记自环和链if(nxt[i]==i||in[i]==0)dfs(i);}for(int i=0;i<26;i++){if(!vis[i]){ans++;//每一个环额外有1的贡献dfs(i);if(!flag){cout<<-1<<'\n';return 0;}}}cout<<ans;return 0;
}
http://www.dtcms.com/a/341666.html

相关文章:

  • cadence16.6修改原理图的Page Number过程中遇到问题
  • 工地智能安全带让高空作业更安全
  • PCB题目基础练习3
  • 前端项目面试分析
  • 解决 nginx: [warn] “ssl_stapling“ ignored, issuer certificate not found 报错
  • cobbler
  • 连续空间强化学习:策略输出的两种形态 —— 概率分布与确定性动作
  • 智慧城市SaaS平台/市政设施运行监测系统之排水管网运行监测、综合管廊运行监测
  • lesson43:Python操作MongoDB数据库完全指南
  • Hyperledger Fabric官方中文教程-改进笔记(十三)-使用测试网络创建通道
  • 25年CATL宁德时代社招晋升竞聘Veirfy测评SHL题库演绎数字语言推理答题指南
  • Js逆向 某花顺登录滑块逆向
  • AI入门学习--理解token
  • Springboot 项目配置多数据源
  • TDengine IDMP 运维指南(5. 使用 Helm 部署)
  • C++ 数据结构 和 STL
  • Python如何将两个列表转化为一个字典
  • Spring Framework 常用注解详解(按所属包分类整理)
  • innovus auto_fix_short.tcl
  • MTK Linux DRM分析(三)- drm_drv.c分析
  • 【智能体记忆】记忆如何塑造我们:深入探究记忆的类型
  • yolov8检测实时视频流,裁剪出未戴头盔的头部方案
  • HarmonyOS相对布局 (RelativeContainer) 基本概念
  • ODPS 十五周年实录 | 为 AI 而生的数据平台
  • 大数据毕业设计选题推荐-基于Hadoop的电信客服数据处理与分析系统-Spark-HDFS-Pandas
  • 文本智能抽取:如何用NLP从海量文本中“炼“出真金?-告别无效阅读,让AI成为你的“信息炼金师
  • OceanBase DBA实战营2期--SQL 关键字限流学习笔记
  • ae复制合成后修改里面图层相互影响问题
  • uos(类linux)系统 打印机自定义打印尺寸
  • MySQL分库分表与MyCAT