今天的比赛又做得不好。
T1:这题各种暴力/水法都能水过。
我是用kmp+暴力匹配。而正解是先二分答案mid,然后枚举A的前mid个字符在B串中匹配的起始位置i,接着在二分求出从i开始做多能匹配的A的前缀,然后接下来看一看后面的部分是否能匹配上就好了。
T2:这一题其实不难,但是我没有想到正解。
dp式很好推,也很容易发现这个dp式可以用线段树来求,关键是如何维护线段树。其实直接用线段树合并+动态开点就好了。
这题还有很多解法,这题的本质就是一个多位偏序问题(我们可以把更新条件看成顺序),cdq分治、扫描线等算法都可以做。
总结:1、比赛时要想清楚一个算法是否可行才开始打,否则会耗费很多时间和精力。
2、我对部分数据结构还是不太熟悉。当要维护很多棵线段树时可以考虑动态开点和线段树合并。而想这题一样要满足很多个大小关系才能更新的一般是cdq分治。
T3:这题其实就是一个NIM问题。而NIM问题先手必胜的条件就是所有堆的石子个数的异或值不为0,为0则必败。
那么问题就转换成了求最大的x,使s^(v-x)=0。其中s=a[l]^a[l+1]...^a[r-1],v=a[r]。因为s^(v-x)=0,所以s=v-x,即x=v-s。
因为这题数据比较水,所以暴力枚举就好了。正解我还不会。