A. 人生
首先考虑基础的dp定义,那么发现转移需要的系数只和dp是奇数的点的个数有关,所以将这个东西记录在dp状态中就行了。
然后推一下dp转移,发现转移系数和奇数的点的个数没有关系,只与是否存在这样的点有关,所以用01来记录就可以了。
B. 赢家(winner)
考虑用总方案减去不合法的方案,也就是1号点能到达的点和2号点能到达的点没有交集。
然后考虑计算出1和2能到达的点恰好为S的方案数。
同样可以用容斥来处理,即枚举S的一个子集,然后暴力减去只能到达这个子集的方案。
然后枚举两个集合统计答案即可。
C. 黑红兔
观察可以发现,必然存在一种最优解,使得相邻两个串长度是连续的。
那么考虑倒过来dp,令$f[i]$表示i开始的最多的区间数。
首先考虑对于每个$f$进行二分答案。
然后只需要找到后面一个$j$,满足他的$dp>=mid-1$且lcp满足限制即可。
用SA处理一下就是rank在一段连续区间,可以用主席树处理出来。
优化的办法是$f[i]<=f[i+1]+1$,所以将二分省掉,直接暴力枚举即可。