2019十二省联考

异或粽子

一段的异或和,先去取前缀异或和,这样异或和就变成了任意两个位置的异或

将每个异或和放到一个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转移过来,城市开头不用管这个限制

最后统计答案时候要同时考虑两个阵营的限制和两个帮派的限制

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值