题意:给一个带有通配符的字符串,以及两个匹配串,要求把这个字符串补全后第一个匹配串出现次数减去第二个出现次数最大。求这个差的最大值。
思路:首先肯定是构造AC自动机。
然后在第一个串结尾的节点处放上1,第二个串结尾处放上-1,就变成了把字符串跑遍之后每一次加上这个节点以及所有\(fail\)的值得到的和最大。
那么就是个在AC自动机上\(dp\)的题。
考虑\(dp(i,j)\)表示现在到了第\(i\)位,跑到了AC自动机的\(j\)号节点,然后转移:
如果这个位置不是通配符,那么就沿着应该走的那条边走过去,否则枚举走的那条边。
由于我们的AC自动机已经被扩充成了\(trie\)图,所以就可以很容易地转移。Orz zcysky