ABC394 赛后总结

ABC394

说个事,为什么 393 没有出笔记?因为觉得太简单了。这次又是 ABCD,非常好啊。

C

这道题大家应该都知道,一个形如 "WWW...WA" 的子串都可以替换成 "ACCC...C",这是一种连通块的思想。我们在序列里面,只处理每个连通块,便可以联想出很多其他的性质,这其实也是一种化困难为简单的思想。

当然,这道题还可以倒着做,每次把 "WA" 换成 "AC",因为 "AC" 的 "A" 是在前面,后面有 "C" 挡住,因此这个新出现的 "A" 就只能与前面的 "W" 进行结合,这样就避免了后效性。

#include <iostream>
#include <algorithm>
#include <time.h> 
#include <cstring>using namespace std;typedef long long LL;
typedef pair<int, int> PII;const int N = 1;string a;int main()
{cin >> a;for (int i = 0; i < a.size(); i ++ ){if (a[i] != 'W') continue;int j = i;while (j < a.size() && a[j] == 'W') j ++ ;if (j >= a.size() || a[j] != 'A'){i = j - 1;continue;}for (int k = i + 1; k <= j; k ++ ) a[k] = 'C';a[i] = 'A';i = j;}cout << a << endl;cerr << clock() << endl;return 0;
}

E

给定一个很小的图,边值为一个小写字母,求所有从 \(i\)\(j\) 的路径中边值组成的字符串中是回文且长度最小的那个。

这道题竟然没有给形式化表达。这道题乍一看好像是 Floyd,这个数据范围和图存储方式都在提醒我们呢。可是,我们并不能从 Floyd 当中得到所有回文子串,也不能得到所有方案。因此,这条路是行不通的。

我们发现,回文串除了能用完全相反对称的字符串拼起来以外,还可以从端点加入两个相等的字符得到新的回文串。由于是在图上,每次扩展得到最短回文串,这不就应该使用 BFS 吗?具体来说,我们把有序二元组 \((i, j), \forall 1 \le i,j \le n\) 看成一个点,如果 \((i, j)\) 中间的路径是回文串的话,那么 \(\forall 1 \le k, l \le n, C_{k, i} = C_{j, l} \ 且\ C_{k, i} \not = '-'\),就都有回文路径。这是 BFS 的原理。

注意考虑初始队列,应该加入所有形如 \((i, i)\) 的二元组,并把它的 BFS 的距离数组值设为 \(0\),这个主要是为了方便处理偶数长度的回文串;对于奇数长度,我们把所有 \(i, j\) 间有直接边的二元组加入,并把距离数组值设为 \(1\)。更新的时候,找到两头能走的边当中相等边值的,更新新的状态即可。

#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
#include <time.h>
#define x first
#define y second using namespace std;typedef long long LL;
typedef pair<int, int> PII;const int N = 110, INF = 0x3f3f3f3f;int n;
char g[N][N];
int dist[N][N];void bfs()
{queue<PII> q;memset(dist, -1, sizeof dist);for (int i = 1; i <= n; i ++ ) q.push({i, i}), dist[i][i] = 0;for (int i = 1; i <= n; i ++ )for (int j = 1; j <= n; j ++ )if (i != j && g[i][j] != '-')dist[i][j] = 1, q.push({i, j});while (q.size()){PII t = q.front(); q.pop();int u = t.first, v = t.second;for (int i = 1; i <= n; i ++ )for (int j = 1; j <= n; j ++ )if (dist[i][j] == -1 && g[i][u] == g[v][j] && g[i][u] != '-'){dist[i][j] = dist[u][v] + 2;q.push({i, j});}}
}int main()
{// freopen("contest.in", "r", stdin);// freopen("contest.out", "w", stdout);scanf("%d", &n);for (int i = 1; i <= n; i ++ )scanf("%s", g[i] + 1);bfs();for (int i = 1; i <= n; i ++ ){for (int j = 1; j <= n; j ++ )printf("%d ", dist[i][j]);puts("");}cerr << clock() << endl;return 0;
}

F

这道题应该比 E 简单一些,更好想(当然也别像我一样死磕)。这种树的题目求最大最小,一定要想到树形 DP。这些树应该会自带性质。我们发现,这个树应该除了叶子节点和根节点,都必须度数为 \(4\),即必须三叉。根节点有两种情况,要么出现四叉,要么度数为 \(1\)。我们单开一个状态来表示度数为 \(1\) 的情况的求值。

我们用 \(f_{i, 0}\) 表示以 \(i\) 根且为三叉树的树中最大的点数,\(f_{i, 1}\) 表示以 \(i\) 为根的 Alkane 中最大的点数。三叉树和四叉树要想最大,子树就必须最大。则我们处理出 \(f_{j, 0}\)\(4\) 大值,记为 \(d_i, 1 \le i \le 4\)。转移方程如下:

\(f_{i, 0} = \begin{cases} d_1 + d_2 + d_3 + 1, & 如果有三个或以上的子节点数 \\ 1, & 如果没有三个子节点 \end{cases}\)

\(f_{i, 1} = \begin{cases} d_1 + d_2 + d_3 + d_4 + 1, & 有四个或以上的节点数 \\ d_1 + 1, & 有子节点,且 d_1 \not= 0 \\ 1, & 无子节点 \end{cases}\)

\(f_{i, 1}\) 其实并不需要求出来,直接在 DFS 的过程中统计即可。但是注意我这个代码,对于 \(d_1 + 1\) 这个式子,如果 \(i\) 就是根节点,是不能够更新的。

#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
#include <time.h>
#define x first
#define y second using namespace std;typedef long long LL;
typedef pair<int, int> PII;const int N = 2e5 + 10, M = N * 2, INF = 0x3f3f3f3f;int n;
int h[N], ne[M], e[M], idx;
int f[N];
int ans;void add(int a, int b)
{ne[++ idx] = h[a], e[idx] = b, h[a] = idx;
}int dfs(int u, int fa)
{int d[4] = {0}, cnt = 0;for (int i = h[u]; i; i = ne[i]){int j = e[i];if (j == fa) continue;int t = dfs(j, u);cnt ++ ;for (int i = 0; i < 4; i ++ )if (t > d[i]){for (int j = 3; j > i; j -- ) d[j] = d[j - 1];d[i] = t;break;}}if (cnt <= 2) return 1; //叶子节点if (u != 1) ans = max(ans, d[0] + d[1] + d[2] + 2);if (cnt >= 4) ans = max(ans, d[0] + d[1] + d[2] + d[3] + 1);return d[0] + d[1] + d[2] + 1; 
}int main()
{// freopen("contest.in", "r", stdin);// freopen("contest.out", "w", stdout);scanf("%d", &n);for (int i = 0; i < n - 1; i ++ ){int a, b;scanf("%d%d", &a, &b);add(a, b), add(b, a);}dfs(1, -1);if (!ans) puts("-1");else printf("%d\n", ans);cerr << clock() << endl;return 0;
}

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

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

相关文章

微信小程序自动生成二维码

1、下载包 npm i weapp-qrcode 安装完成之后,出现这个文件夹 2. 构建npm打开微信开发者工具,进入对应的小程序项目。点击菜单栏中的 “工具” -> “构建 npm” 。 构建完成后,会在项目中生成一个miniprogram_npm文件夹 3、页面中引用 在js中调用方法 先引用: 显示效果…

QT布局管理器(QVBoxLayout,QHBoxLayout)不同部分比例大小设置方法

QT布局管理器(QVBoxLayout,QHBoxLayout)不同部分比例大小设置方法默认情况如果将多个控件加入到QT的布局管理器中(QVBoxLayout、QHBoxLayout)所有控件占用的宽度/高度是等比例大小的。然后,在实际应用和开发中往往希望在同一个布局管理器中,根据控件实际显示内容的多少或…

哪吒探针V1:全新版安装

哪吒探针可以方便的帮助我们监控服务器性能。 本文为大家带来最新版v1的安装过程。 一、安装控制面板 运行一键安装脚本 curl -L https://gitee.com/naibahq/scripts/raw/main/install.sh -o nezha.sh && chmod +x nezha.sh && sudo CN=true ./nezha.sh这里我们…

分散的离开公司的跨国纠纷的广泛斯大林年的;;;反斯大林可能的司法法国vdnmfjioaspgrjosgmdlfbdfvb

法斯基返回南京了哦;角色的绿柠檬酸公司经理年女郎科技的风格vs的风俗哦管理呢诺夫斯基考虑过赛时T1正解没调出来。打暴力,第二个暴力二分挂了但第一档暴力都是第二档的数据,but我先判的第二档,so人麻了。 不管了反正都要退役了,就先**这样吧。__________________________…

FrameScan:cms漏洞检测框架

免责声明: 工具仅供安全研究与学习之用,若将工具做其他用途,由使用者承担全部法律及连带责任,作者及发布者不承担任何法律及连带责任。信息及工具收集于互联网,真实性及安全性自测!!!项目介绍 FrameScan是一款python3编写的简易的cms漏洞检测利用框架,支持漏洞检测与简…

fork打开VS Code

在 File → Preferences → Custom Commands 中,添加 Respository 命令。 #!/bin/bash# 已知的路径格式(Unix/Linux风格,其中/d表示D盘) unix_path=$PWD# 提取盘符(注意:这里假设盘符总是小写,并且紧跟在根斜杠后面) disk_letter="${unix_path:1:1}" disk_le…

Windows平台调试器原理与编写02.一般断点与反汇编引擎

https://www.bpsend.net/thread-256-1-2.html 一般断点(软件断点) 断点的尊严断的下来 走的过去 下次还来所有合格的断点都应该满足这3个要求 OD下断点实际是把指令的第一个字节改成了CC,当程序执行到CC的时候其实是抛了一个异常(EXCEPTION_BREAKPOINT),这个异常就会进入调试器…

输入搜索、分组展示选项、下拉选取,全局跳转页,el-select 实现 —— 后端数据处理代码,抛砖引玉展思路

详细前端代码写于上一篇:输入搜索、分组展示选项、下拉选取,el-select 实现:即输入关键字检索,返回分组选项,选取跳转到相应内容页 —— VUE项目-全局模糊检索 【效果图】:分组展示选项 =>【提供界面操作体验】 【mybatis】:多数据表抓取数据<select id="fin…

使用@SpringBootApplication注解

https://docs.spring.io/spring-boot/docs/2.0.x/reference/html/using-boot-using-springbootapplication-annotation.html许多Spring Boot开发人员希望他们的应用程序能够使用自动配置(auto-configuration)、组件扫描(component scan),并能够在其“应用程序类(applicat…

跨时钟域-单脉冲信号处理方法

逻辑设计中将所有同步元件(例如触发器和RAM等)使用相同时钟信号的部分称为时钟域。 退出亚稳态所需的时间被称为resolution Time(Tr)。 由于建立时间的违反,寄存器的输出电压可能是代表逻辑高、逻辑低,甚至更糟糕的是介于逻辑高和逻辑低之间的电压。 亚稳态是指触发器无法…

VMWare workstation pro 17 Windows11 中提示不能 支持Intel VT-x 虚拟化的问题终极解决方案

1. 在BIOS中开启虚拟化 2. 在系统功能里面取消hyper-v,虚拟机管理平台,沙盒功能, 虚拟机监控平台四个功能。 3. 在内核隔离里面取消内存隔离。 4. 运行下面的批处理。 5.重启后会有两次提示是否关闭vbs,两次按F3关闭,重启后一切正常。===================================…

PipeCAD Spooler 管道加工设计工具

PipeCAD Spooler是一款专门为管道预制厂商设计的管道深化加工设计和管理的工具。有以下一些功能:+ 直接导入PCF/IDF管道数据进行深化设计,大大提高设计效率; + 精确的材料统计,为材料采购提供准确数据; + 通过深化设计将管线拆分为易于车间加工的管段,提高加工质量,缩短…