当前位置: 首页 > 知识库问答 >
问题:

从子树中查找所需的最小字符

卫飞
2023-03-14

您将得到一个有N个节点的有根树。每个节点包含一个小写英文字母。标签为%1的节点是根。有Q个问题的形式,X,S:这里X是子树的根,S是一个字符串。

输入格式:

第一行输入由两个空格分隔的整数N和Q组成,它们分别是树中的节点数和问题数。下一行将包含N个空格分隔的小写英文字母,其中第i个字母将是存储在带有标签i的节点中的字母。接下来的n-1行中的每一行都包含两个空格分隔的整数u和v,表示在接下来的Q行后面带有标签u和v的节点之间有一条边。每一行将包含一个表示节点标签的整数X和一个由单个空格分隔的字符串S。

输出格式:

对于每个查询,在新行中打印所需答案。

输入约束2≤n≤105 1≤q≤105 1≤u,v≤n;u!=v1≤x≤n

4 8

6 1

5 3

6

7

2

共有1个答案

微生令雪
2023-03-14

由于查询非常高的(10^5),因此在子树上进行迭代并使用给定的字符串频率进行检查将不是一个有效的方法。您可以使用MO在树中的算法轻松地解决这类问题。这样每个查询都可以用SQRT(N)复杂度来解决,从而得到整体的O(q*SQRT(N))复杂度。
有关MO算法的详细信息,您可以查看此图。

注意:如果需要,我可以提供实现细节。

 类似资料:
  • 我有一个字符串s和一个整数k(子字符串长度),我正在尝试编写函数,这样它就可以找到长度为k的最小和最大的子字符串。并返回一个字符串,其中最小和最大的子字符串与换行符组合在一起。 到目前为止,我用下面的方法解决了这个问题,我编写了相同的代码来查找最小和最大的子字符串,然而,我想用流返回两个子字符串的单行代码。 我非常感谢任何建议,因为我现在正在学习lambda和stream。 那么,我该如何优雅地解

  • 文件输入。txt由两行组成:第一行是整数N空格,然后是整数K(1 ≤ N、 K级≤ 250000). Second有N个空间除数的整数,其中每个整数都小于或等于K。保证从1到K的每个整数都在数组中。任务是找到包含所有整数的最小长度的子数组。并打印其开始和结束。请注意,索引从1开始。 示例: 我在最近的一次编程比赛中完成了这个任务。一切都结束了,我没有作弊。我已经使用python 3实现了它: 这个

  • 我试图从字符串中找到最小的子字符串(包含 set 的所有值) 例如: 因为< code>OxVxT是示例1中最小的子串(包含集合的所有元素),所以我为它编写了代码,但这不是最好的方法,也不适用于所有示例,我没有通过我的代码找到最小的子串,我的代码如下: 我找到所有可能的子字符串索引,然后找到它们之间的距离,并且距离最短的子字符串是字符串中最小的子字符串。我的代码不能处理所有测试用例,也没有给出正确

  • 我试图递归地在二叉树中找到最小值(不是二叉查找树)。让我困惑的是基本情况。如果TreeNode t为空,返回什么?因为我将使用返回的值将其与当前的最小值进行比较(我认为),我相信我返回的内容很重要。

  • 我试图从BST中删除最小节点,所以我在树中搜索,直到得到最小值(当root.leftnode为None时),然后将root.rightnode设置为根本身,以继续BST。 问题是,当我这样做之后检查树时,它不会显示曾经发生过的删除。 有人可以指出我正确的方向吗,任何建议都值得赞赏。

  • 这是在线编码挑战之一(已完成)提出的问题<我只是需要一些逻辑来说明如何接近。 我们有两个字符串A和B,具有相同的超字符集。我们需要改变这些字符串来获得两个相等的字符串。在每个步骤中,我们可以执行以下操作之一: 移动可以在任一字符串上执行。 为了获得两个相等的字符串,我们需要的最小移动次数是多少? 输入格式和约束: 输入的第一行和第二行包含两个字符串A和B。保证它们的超集字符相等。 输出格式: 将最