首页 > 其他分享 >异或树学习指南

异或树学习指南

时间:2023-11-05 21:58:58浏览次数:30  
标签:学习指南 字符 parent 字母 异或 字符串 节点 回文

前置芝士

异或

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

[problem description]

给你一棵 树(即,一个连通、无向且无环的图), 节点为 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) ,并返回节点对的数目。

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

[input]

img

输入: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" 。

[datas]

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

[solved]

1.可重排回文串等价于至多一个字母出现奇数次,其余字母出现偶数次。

2.用一个长为 26 的二进制数来压缩存储每个字母的奇偶性,只有 27个二进制数符合要求。

0表示每个字母都出现偶数次。
$20,21,\cdots,2^{25} $表示第 i 个字母出现奇数次,其余字母出现偶数次。

from collections import Counter
class Solution:
    def countPalindromePaths(self, parent: List[int], s: str) -> int:
        n=len(s)
        e=[[] for _ in range(n)]
        for i in range(1,n):
            e[parent[i]].append(i)
        ans=0
        cnt=Counter([0])
        def dfs(v:int,xor:int)->None:
            nonlocal ans
            for w in e[v]:
                bit=1<<(ord(s[w])-ord('a'))
                x=xor^bit
                ans+=cnt[x]+sum(cnt[x^(1<<i)] for i in range(26))
                cnt[x]+=1
                dfs(w,x)
        dfs(0,0)
        return ans

异或最小生成树

标签:学习指南,字符,parent,字母,异或,字符串,节点,回文
From: https://www.cnblogs.com/taotao123456/p/17811264.html

相关文章

  • 倍增算法学习指南
    前置芝士倍增思想ST表(SparseTable,稀疏表)是一种简单的数据结构,解决RMQ(区间最大/最小值查询)问题。主要应用倍增思想。O(NlogN)的预处理,O(1)的查询。ST表是用于解决可重复贡献问题的数据结构。[预处理ST表]倍增法递推:用两个等长小区间拼凑一个大区间。f[i][j]表示以第i个数......
  • python实现shellcode异或加密自动化
    实现的结果如下:1.python脚本里面xorkey随机生成长度16位2.加密后的payload和key直接写入到模板里面3.编译使用gcc编译每次输出文件名随机完成一个自动化过程用法pythonmain.pyshellcode.bin其中shellcode.bin是自己的shellcode二进制文件,项目中的是一个弹出错误框......
  • 【教3妹学编程-算法题】数组中两个数的最大异或值
    3妹:“太阳当空照,花儿对我笑,小鸟说早早早,你为什么背上炸药包”2哥 :3妹,什么事呀这么开心呀。3妹:2哥你看今天的天气多好啊,阳光明媚、万里无云、秋高气爽,适合秋游。2哥:是啊,都快立冬了,天气还是这么热。今年的冬天比以往来的要晚一些。3妹:晚来也是要来的,看天气预报下周要降温,估计没几......
  • 字节笔试题-区间异或
    题目给两个长度为n的数组a,b,请你计算出有多少个区间[l,r],满足\(a_{l}\oplusa_{l+1}\oplusa_{l+2}\oplus\ldots\oplusa_{r}=b_{l}\oplusb_{l+2}\oplusb_{l+2}\oplus\ldots\oplusb_{r}\)(\(\oplus\)表示按位异或)输入描述第一行输入一个整数n,表示数组长度。第二行输......
  • 数据结构与算法(LeetCode)第一节:认识复杂度,对数器,二分法与异或运算
    一、认识复杂度1.评估算法优劣的核心指标:时间复杂度:当完成了表达式的建立,只要把最高阶项留下即可。低阶项都去掉,高阶项的系数也去掉,记为O(去掉系数的高阶项);​ 时间复杂度是衡量算法流程的复杂度的一种指标,该指标只与数据量有关,与过程之外的优化无关常见的时间复杂度(从好到坏)O......
  • 随机算法学习指南
    整数数组随机生成算法[python]#pythonimportrandomarray=[random.randint(-100,100)for_inrange(1000)]foriinarray:print(i,end="")随机抽取一组不重复的数Fisher-Yates洗牌算法(Knuth洗牌算法)时间复杂度优化到了O(n),空间复杂度优化到了O(1)。voidshuffle......
  • C++算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例
    相关源码测试用例下载包括4个压缩包,初始代码,实现前缀和,实现前缀积,实现前缀异或。都是在前者的基础上修改的。原理长度为n的数组nums,共有n+1个以nums[0]开始的子数组。索引范围分别为[0,i),i取值区间[0,n]。preSum[i]记录子数组[0,i)的和。比如:nums={1,2,3,4},则preSum={0,1,3,6......
  • 时间格式处理学习指南
    前置芝士h:m:s转为secondsintpto(stringtime){ inth,m,s; sscanf(time.c_str(),"%d:%d:%d",&h,&m,&s); returnh*3600+m*60+s;}seconds转为h:m:sstringsto(intseconds){ inth=seconds/3600; seconds%=3600; intm=seconds/60; ints=second......
  • 正则表达式学习指南
    前置芝士转移字符\r、\n回车,换行符\t制表符\\\^\$\.\d匹配数字\w匹配字母、数字、下划线\s匹配空格、制表符、换页符、空白符特殊符号{n}{m,n}{m,}?+*^$\b|()朴素匹配[ABC][^ABC][A-Z][0-9].or[^\n\r]匹配除换行符(\n、\r)之外的......
  • P9745 「KDOI-06-S」树上异或 题解
    原题挺好的树形dp,正好dp不太熟练,练习一下赛时只想到了暴力和\(X\leq7\)的链的部分分,过于naive不说了先考虑链的情况,既然是二进制考虑按位拆分。设\(g_{i,j,0/1}\)表示以\(i\)为根,从\(i\)点连通块的疑惑和第\(j\)位为\(0/1\),除去连通块部分的积的和。然后设......