牛客小白月赛91 ----- Bingbong的回文路径 ---- 题解

2024-04-21 18:12

本文主要是介绍牛客小白月赛91 ----- Bingbong的回文路径 ---- 题解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Bingbong的回文路径:

题目描述:

思路解析:

现在有一棵树,树上每个结点上都有一个小写字母,那么如果唯一确定了x和y两个结点,那么就唯一确定了一个字符串路径(最短路径)。 -现在给出q次查询,问x和y这个路径是否是回文字符串。

一看到回文字符串就可以应当想到字符串hash。但是怎么快速查询这个路径上字符串的hash值变成为了关键,可以发现,根节点到到任意结点的路径是确定的,并且是可以在一次dfs遍历中维护出来根据点到任意结点的字符串路径hash值的,那我们检查这个值有什么用。

假设我们查询红色结点到蓝色结点,那么可以发现,我们只需要找到他们最小公共祖先就可以利用他们三个结点的hash值来维护任意结点之间的hash值了。那么这道题就可以做了

代码实现:

import java.util.*;import java.io.*;public class Main {static long[] pow = new long[100005];static long[] inv = new long[100005];public static void main(String[] args) throws IOException {Random random = new Random();for (int i = 0; i < 26; i++) {s[i] = random.nextInt(10000);}pow[0] = 1;inv[0] = 1;long invb = qkm(base);for (int i = 1; i < 100005; i++) {pow[i] = pow[i - 1] * base % mod;inv[i] = inv[i - 1] * invb % mod;}int t = 1;while (t > 0) {solve();t--;}w.flush();w.close();}static char[] str;static int[] s = new int[26];static int mod = (int) 1e9 + 9;static int base = 131;static Vector<Integer>[] g;static int[] dep;static int[][] st;static long[] pre;static long[] suf;public static void solve() throws IOException {int n = f.nextInt();str = (" " + f.next()).toCharArray();g = new Vector[n+1];dep = new int[n+1];st = new int[n+1][20];pre = new long[n+1];suf = new long[n+1];for (int i = 0; i < n + 1; i++) {g[i] = new Vector<>();}for (int i = 1; i <= n; i++) {int x = f.nextInt();g[x].add(i);}dfs(1, 0);for (int j = 1; j < 20; j++) {for (int i = 1; i <= n; i++) {st[i][j] = st[st[i][j-1]][j-1];}}int q = f.nextInt();for (int i = 0; i < q; i++) {int x = f.nextInt(); int y = f.nextInt();if (check(x,y)) w.println("YES");else w.println("NO");}}public static boolean check(int x, int y){int fa = lca(x, y);long a = (pre[x] - (pre[fa] * pow[dep[x] - dep[fa]] % mod)) % mod;long b = (pre[y] - (pre[fa] * pow[dep[y] - dep[fa]] % mod)) % mod;long c = (suf[x] - suf[fa]) * inv[dep[fa]] % mod;long d = (suf[y] - suf[fa]) * inv[dep[fa]] % mod;a = (a + mod) % mod;b = (b + mod) % mod;c = (c + mod) % mod;d = (d + mod) % mod;long A = (s[str[fa] - 'a'] * pow[dep[x] - dep[fa]] % mod + a + d * pow[dep[x] - dep[fa] + 1] % mod) % mod;long B = (s[str[fa] - 'a'] * pow[dep[y] - dep[fa]] % mod + b + c * pow[dep[y] - dep[fa] + 1] % mod) % mod;return A == B;}public static int lca(int x, int y){if (dep[x] < dep[y]) {int tmp = x; x = y; y = tmp;}for (int i = 19; i >= 0; i--) {if (dep[st[x][i]] >= dep[y]){x = st[x][i];}}if (x == y) return x;for (int i = 19; i >= 0; i--) {if (st[x][i] != st[y][i]){x = st[x][i]; y = st[y][i];}}return st[x][0];}public static long qkm(long a){long res = 1;long b = mod - 2;while (b > 0){if ((b & 1) == 1) res = (res * a) % mod;a = a * a % mod;b >>= 1;}return res;}public static void dfs(int x, int fa){dep[x] = dep[fa] + 1;st[x][0] = fa;pre[x] = (pre[fa] * base % mod+ s[str[x]-'a']) % mod;suf[x] = (suf[fa] + s[str[x]-'a'] * pow[dep[fa]] % mod) % mod;for (int i = 0; i < g[x].size(); i++) {int y = g[x].get(i);if (y == fa) continue;dfs(y, x);}}static PrintWriter w = new PrintWriter(new OutputStreamWriter(System.out));static Input f = new Input(System.in);static class Input {public BufferedReader reader;public StringTokenizer tokenizer;public Input(InputStream stream) {reader = new BufferedReader(new InputStreamReader(stream), 32768);tokenizer = null;}public String next() throws IOException {while (tokenizer == null || !tokenizer.hasMoreTokens()) {tokenizer = new StringTokenizer(reader.readLine());}return tokenizer.nextToken();}public String nextLine() throws IOException {String str = null;str = reader.readLine();return str;}public int nextInt() throws IOException {return Integer.parseInt(next());}public long nextLong() throws IOException {return Long.parseLong(next());}public Double nextDouble() throws IOException {return Double.parseDouble(next());}}
}

这篇关于牛客小白月赛91 ----- Bingbong的回文路径 ---- 题解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/923740

相关文章

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

VSCode设置python SDK路径的实现步骤

《VSCode设置pythonSDK路径的实现步骤》本文主要介绍了VSCode设置pythonSDK路径的实现步骤,包括命令面板切换、settings.json配置、环境变量及虚拟环境处理,具有一定... 目录一、通过命令面板快速切换(推荐方法)二、通过 settings.json 配置(项目级/全局)三、

使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)

《使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)》字体设计和矢量图形处理是编程中一个有趣且实用的领域,通过Python的matplotlib库,我们可以轻松将字体轮廓... 目录背景知识字体轮廓的表示实现步骤1. 安装依赖库2. 准备数据3. 解析路径指令4. 绘制图形关键

如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)

《如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)》:本文主要介绍如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)问题,具有很好的参考价值,希望对大家有所帮助,如有... 目录先在你打算存放的地方建四个文件夹更改这四个路径就可以修改默认虚拟内存分页js文件的位置接下来从高级-

一文详解如何查看本地MySQL的安装路径

《一文详解如何查看本地MySQL的安装路径》本地安装MySQL对于初学者或者开发人员来说是一项基础技能,但在安装过程中可能会遇到各种问题,:本文主要介绍如何查看本地MySQL安装路径的相关资料,需... 目录1. 如何查看本地mysql的安装路径1.1. 方法1:通过查询本地服务1.2. 方法2:通过MyS

Python如何调用指定路径的模块

《Python如何调用指定路径的模块》要在Python中调用指定路径的模块,可以使用sys.path.append,importlib.util.spec_from_file_location和exe... 目录一、sys.path.append() 方法1. 方法简介2. 使用示例3. 注意事项二、imp

使用Python实现矢量路径的压缩、解压与可视化

《使用Python实现矢量路径的压缩、解压与可视化》在图形设计和Web开发中,矢量路径数据的高效存储与传输至关重要,本文将通过一个Python示例,展示如何将复杂的矢量路径命令序列压缩为JSON格式,... 目录引言核心功能概述1. 路径命令解析2. 路径数据压缩3. 路径数据解压4. 可视化代码实现详解1

Linux修改pip和conda缓存路径的几种方法

《Linux修改pip和conda缓存路径的几种方法》在Python生态中,pip和conda是两种常见的软件包管理工具,它们在安装、更新和卸载软件包时都会使用缓存来提高效率,适当地修改它们的缓存路径... 目录一、pip 和 conda 的缓存机制1. pip 的缓存机制默认缓存路径2. conda 的缓

Windows系统下如何查找JDK的安装路径

《Windows系统下如何查找JDK的安装路径》:本文主要介绍Windows系统下如何查找JDK的安装路径,文中介绍了三种方法,分别是通过命令行检查、使用verbose选项查找jre目录、以及查看... 目录一、确认是否安装了JDK二、查找路径三、另外一种方式如果很久之前安装了JDK,或者在别人的电脑上,想

Python中Windows和macOS文件路径格式不一致的解决方法

《Python中Windows和macOS文件路径格式不一致的解决方法》在Python中,Windows和macOS的文件路径字符串格式不一致主要体现在路径分隔符上,这种差异可能导致跨平台代码在处理文... 目录方法 1:使用 os.path 模块方法 2:使用 pathlib 模块(推荐)方法 3:统一使