时间过得好快......
首先我们考虑一个链怎么做。
显然有个想法是一个一个接字符串,每次接的时候算一下最长的重叠位置(使用 kmp)即可。
但这样在 \(a\) 完全包含 \(b\) 的时候会出问题。
如果 \(a\) 完全包含 \(b\) 不难发现可以直接去掉 \(b\),当字符串两两并不完全包含的情况下这个想法是正确的。
那么可以设 \(dp(mask,i,0/1)\) 表示拼接了集合 mask 内的串,末尾是第 \(i\) 个串,且是正着还是倒着。
考虑上环:去掉包含关系以后,显然末尾只会和开头匹配:特判一下 \(n=1\) 的 corner 即可。
预处理复杂度 \(O(n^2\times |S|)\),dp部分复杂度 \(O(2^n\times n^2)\)。
标签:11,包含,复杂度,times,杂题,dp From: https://www.cnblogs.com/Cry-For-theMoon/p/16850235.html