异或粽子
一段的异或和,先去取前缀异或和,这样异或和就变成了任意两个位置的异或
将每个异或和放到一个01trie里,01trie支持询问与任意一个数的异或第k大值
先把每个位置的异或最大值找出来,放到一个大根堆里,每次取出一个位置的k大值答案后再将k+1大值放到大根队里,取够需要的次数就行
为了保证不重复,对于每个粽子,每次只能取出编号在他前面的,所以要用可持久化01trie
春节十二响
树上启发式合并
字符串问题
暴力的话将A向支配的B连边,B再向每个A(符合B是A的前缀)连边,找最长路
SAM找子串:建立SAM,记录每个前缀所在的节点,SAM树上的父亲节点指向是一个字符串的后缀,故需要找区间[l,r]所在位置,需要在[1,r]所在节点向上找,只需找到一个节点最长长度>=r-l+1且它的父亲的最长长度<r-l+1,倍增即可
然后需要将B连向A,为了满足B是A的前缀,字符串反着建SAM,这样每个节点的父亲节点就是这个字符串的前缀了(后缀树优化建图)
需要将A连向支配的B,在树上跑最长路
为了防止A连向B时出现问题(就是可能每个A串后面不跟B串,而是跟着比这个B串更短的A串),将所在节点拆点即可
皮配
设置dp,dp[i][j][k]表示选取蓝阵营i人,鸭派系j人,上一个选了k阵营
每次转移时,一个城市的需要从相同的k转移过来,城市开头不用管这个限制
最后统计答案时候要同时考虑两个阵营的限制和两个帮派的限制