Collapsing Strings

做这道题目的时候学CDQ和整体二分学成傻逼了是吧?我寻思着非要把一整个数组传进去操作,明明一个一个考虑不就好了真的烦躁

题外话,做这道题目的时候,探索出来一个东西,vector要放字符串的话,template可以写char *

最开始的想法是编写一个函数work(vector<char *> a,vector<char *> b),然后\(a\)代表的是\(s_i\)\(b\)代表的是\(s_j\)

考虑统计答案,我们枚举\(26\)个字符中的某一个,然后把\(a\)\(b\)中以此字符开头/结尾的字符串找出来,递归处理这些字符串的贡献,然后这些字符串与其他的字符串的贡献可以\(O(1)\)算出

但是这个代码非常难写,而且有vector递归,直接爆栈

然后看到了前缀后缀,想到了trie,故转换思路,把所有字符串倒序插入建立trie树,然后把所有字符串放到一个vector中传到递归函数里面类似地统计答案,仍然会MLE

然后想到给每个trie节点都开一个vector,放在全局变量里面,但是好像即使什么元素都没有放,仍然会MLE

好煞笔啊真的,为什么一定要一次性处理所有字符串呢?真的是CDQ和整体二分学傻了,一个一个处理统计答案就好了

另外做这道题目的时候,一定要慢慢地把细节想清楚,不然也会写很久

update 2024.7.14

重新做一遍这个题目,很快就做出来了,所以说脑子别晕就好了

当然也可以不推这个公式,在trie树上维护一些额外的信息就好了(只不过推了这个公式更容易看出前后缀所以要利用trie树)

但是可以好好想想为什么\(tot\)之和就是答案(提示:从每个字符串的贡献角度考虑),然后可以记住这个trie的操作,查询公共前后缀长度就可以用

posted @ 2024-03-01 17:39  最爱丁珰  阅读(5)  评论(0编辑  收藏  举报