首页 > 其他分享 >数学题-位运算-2791. 树中可以形成回文的路径数

数学题-位运算-2791. 树中可以形成回文的路径数

时间:2023-07-30 18:25:27浏览次数:51  
标签:字符 parent 路径 字符串 数学题 2791 树中 节点 回文

2791. 树中可以形成回文的路径数

Description

Difficulty: 困难

Related Topics: 位运算, , 深度优先搜索, 动态规划, 状态压缩

给你一棵 (即,一个连通、无向且无环的图), 节点为 0 ,由编号从 0n - 1n 个节点组成。这棵树用一个长度为 n 、下标从 0 开始的数组 parent 表示,其中 parent[i] 为节点 i 的父节点,由于节点 0 为根节点,所以 parent[0] == -1

另给你一个长度为 n 的字符串 s ,其中 s[i] 是分配给 iparent[i] 之间的边的字符。s[0] 可以忽略。

找出满足 u < v ,且从 uv 的路径上分配的字符可以 重新排列 形成 回文 的所有节点对 (u, v) ,并返回节点对的数目。

如果一个字符串正着读和反着读都相同,那么这个字符串就是一个 回文

示例 1:

输入:parent = [-1,0,0,1,1,2], s = "acaabc"
输出:8
解释:符合题目要求的节点对分别是:
- (0,1)、(0,2)、(1,3)、(1,4) 和 (2,5) ,路径上只有一个字符,满足回文定义。
- (2,3),路径上字符形成的字符串是 "aca" ,满足回文定义。
- (1,5),路径上字符形成的字符串是 "cac" ,满足回文定义。
- (3,5),路径上字符形成的字符串是 "acac" ,可以重排形成回文 "acca" 。

示例 2:

输入:parent = [-1,0,0,0,0], s = "aaaaa"
输出:10
解释:任何满足 u < v 的节点对 (u,v) 都符合题目要求。

提示:

  • n == parent.length == s.length
  • 1 <= n <= 105
  • 对于所有 i >= 10 <= parent[i] <= n - 1 均成立
  • parent[0] == -1
  • parent 表示一棵有效的树
  • s 仅由小写英文字母组成

Solution

回文字符串等价于所有出现字符至多一个出现奇数次,可以用位运算来记录状态。
同时依据异或运算的法则,任意两个节点的异或等于从root到各个节点的状态的异或。
Language: Python3

class Solution:
    def countPalindromePaths(self, parent: List[int], s: str) -> int:
        g = defaultdict(list)

        for i, p in enumerate(parent):
            g[p].append(i)
        
        res = 0
        record = defaultdict(int)
        record[0] = 1

        def dfs(root, curr):
            nonlocal res

            for c in g[root]:
                bit = curr ^ (1 << (ord(s[c]) - ord("a")))
                res += record[bit]
                for i in range(26):
                    res += record[(1 << i) ^ bit]
                record[bit] += 1
                dfs(c, bit)

        dfs(0, 0)

        return res
        

标签:字符,parent,路径,字符串,数学题,2791,树中,节点,回文
From: https://www.cnblogs.com/hyserendipity/p/17591776.html

相关文章

  • Luogu 2791 幼儿园篮球题
    考虑枚举选出来\(i\)个没气的篮球,那么答案可以表示成:\[\text{ans}=\frac{1}{\dbinom{n}{k}}\sum\limits_{i=0}^{k}\dbinom{m}{i}\dbinom{n-m}{k-i}i^L\]注意到这里的组合数\(\dbinom{n}{m}\)在\(n<m\)或者\(m<0\)时无意义,直接当成\(0\)即可。考虑普通幂转下降幂:\[i^......
  • 2023.7.14 在二叉树中分配硬币
    借用灵神的图:所以一个直观的想法就是,计算这个子树的硬币个数和节点个数的差的绝对值。这个就是需要传递给父结点的硬币数量。如果这个子树中的子结点也全部执行了这个操作,那么就会把硬币全部集中到当前结点,因此不用考虑子结点中的移动。所以这是个递归算法。(因为要先完成子结......
  • POJ 2109 Power of Cryptography 数学题 double和float精度和范围
    PowerofCryptographyTimeLimit:1000MSMemoryLimit:30000KTotalSubmissions:21354Accepted:10799DescriptionCurrentworkincryptographyinvolves(amongotherthings)largeprimenumbersandcomputingpowersofnumbersamongtheseprimes.Workint......
  • 简单的数学题
    简单的数学题\[\Sigma_{i=1}^{n}\Sigma_{j=1}^{n}ijgcd(i,j)\,\,\,\,n\leqslant1e10\]正常莫反\[\Sigma_{d=1}^{n}\Sigma_{i=1}^{\lfloor{\frac{n}{d}}\rfloor}\Sigma_{j=1}^{\lfloor{\frac{n}{d}}\rfloor}ij[gcd(i,j)==1]\]\[\Sigma_{d=......
  • 题:二叉树中m是n的祖先,通过(后序遍历)可以找到m到n的路径
     选项:先序?中序?后序?层次? 题解:1.首先是对路径的解释:访问一个结点x时,栈中结点恰好是x结点的所有祖先,从栈底到栈顶所有结点加上x结点,就构成了从根结点到x结点的一条路径。2.分析:为什么不是先序遍历?(第一次做题时以为这个路径指的是遍历的结果,那先序自然就满足,但这个路径不是遍历......
  • LeetCode 701. 二叉搜索树中的插入操作
    题目链接:LeetCode701.二叉搜索树中的插入操作题意:给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。返回插入后二叉搜索树的根节点。输入数据保证,新值和原始二叉搜索树中的任意节点值都不同。解题思路:按照二叉搜索树的定义,直接进行模拟......
  • LeetCode 501. 二叉搜索树中的众数
    题目链接:LeetCode501.二叉搜索树中的众数题意:给你一个含重复值的二叉搜索树(BST)的根节点root,找出并返回BST中的所有众数(即,出现频率最高的元素)。如果树中有不止一个众数,可以按任意顺序返回。解题思路:递归法由于是二叉搜索树,中序遍历是有序的,因此相当于在一个有序的......
  • 二叉树中的递归算法(二)
    从二叉树遍历看递归二叉树二叉树(binarytree)是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树。二叉树的遍......
  • JZ82 二叉树中和为某一值的路径(一)
    二叉树递归/***structTreeNode{*intval;*structTreeNode*left;*structTreeNode*right;*TreeNode(intx):val(x),left(nullptr),right(nullptr){}*};*/classSolution{public:/***代码中的类名、方法名、参数名已经......
  • 代码随想录算法训练营第十七天| 654.最大二叉树 617.合并二叉树 700.二叉搜索树中
     654.最大二叉树 比较简单,直接上代码1TreeNode*constructMax_cursor(vector<int>&nums)2{3if(nums.size()==0)returnNULL;4//getMaxNum5intindex=0;6intmax_=INT_MIN;7for(inti=0;i<nums.size();i++)8......