这道题真是敲得我蛋都碎了 碎了一地啊
直接搜很明显是不可以的 因为其实弄个什么3次方复杂度绝对炸
一开始的判断
1. 由于添加的COW是一起的,因此给出的字符串的字符个数应该等于47(目标字符串的长度)+3*k。如果不满足就可直接判断无解。
2. 除了COW三个字符外,其他的字符的个数应该和目标串相一致。如果不一致也可直接判断无解。
然后讲一下牛逼的剪枝 真佩服那些想出来的
1.字符串判重。
2.先枚举O,再枚举C,W。枚举W时从后往前枚举。
3.对于所有的C,O,W字母可以将字符串切成好几段,但是无论我们怎么交换C-O之间和O-W之间的字符串,这些小段字符串是不会被分开的。所以对于每一个状态我们判断所有C,O,W切成的小段是否在目标串中出现过。这是非常厉害的剪枝。
4.剪枝3只是判断某些字符串小段是否在目标串中出现过,还可以对这些小段的第一段和最后一段加强限制。即当前串的最小的结尾字符的后一个字符是C的前缀必须是目标串的前缀,当前串最小的开头字符的前一个字符是W的后缀必须是目标串的后缀。这也是非常重要的剪枝。
大概这样打就没问题了吧 然而可能我写搓了还是判重不够快什么的 (我还写了trie树的啊。。)
学学别人怎么打吧 代码就别看我的了
因为实在有两个点不行 弄了个搜索次数上线搞过去了。唔