A.
题目中给出了奇怪的k个点,满足删掉这k个点之后无环。
那么,这k个点内部一定存在拓扑序,其余的点内部一定也存在拓扑序。
可以发现,只要删掉原图中所有的三元环就可以满足条件。
所以说可以发现,对于剩余的点,必然在另外k个点的拓扑序中存在分界点,满足分界点之前都从k个点连向这个点,后面相反。
那么只要分别求出来两边的拓扑序简单dp即可。
B.
考虑每一对相同的子串的贡献,那么只要一个串包含了这一对子串并且前缀是一对子串之一,那么就是就有1的贡献。
所以直接建出来SAM,找出所有相同的子串,简单维护即可。
C.
首先操作顺序不影响结果。
不难发现,对于一个位置操作,对于后面造成的影响是下一个位置+1,前面第一个0变成1,第一个0后面的数-1,自己位置-1。
那么可以发现0的位置变化只有可能是向前移动1或者去掉一个0,这个东西简单维护就行了。
比较好的做法是用一个栈来维护,然而我考场打的恶心了被卡常,虽然我存数组用的char爆了。