题目大意:
就是现在给你两个长度不超过20W的字符串, 都只包含小写字母, 求相同的回文串对数 (S, T), 其中S == T, S来自第一个字符串, T来自第二个字符串, S和T都是回文串
大致思路:
首先很容易想到的是Manacher + 后缀数组二分 + Hash的做法, 复杂度O(nlogn), 可惜的是这个题目Hash容易被卡
试了好几次Hash之后试了一发二次Hash居然神奇地过了= =...不过这题用Hash还是太靠RP了, 而且幸好时间放的宽到了20s
另外一个正确的解法是用回文树Palindromic Tree, 对于串A, B分别建立回文树, 然后从根节点(奇数的根节点和偶数根节点分别进行一次) dfs, 如果有相同的回文串必然存在相同的代表结点, 其根节点到那个回文的结点的路径也是相同的
于是两棵树同时遍历, 因为Palindromic Tree可以在O(n)的时间复杂度中处理出每种回文串的个数, 所以计数就很方便了, 另外由于回文个数在O(n)以内, dfs复杂度也是O(n)
所以在O(n)的复杂度解出这题就很容易了
两种方法的代码如下:
Manacher + 后缀数组二分 + Hash的做法 ( RP因素较高 ) :
( Hash大法好, Hash出奇迹(>_<) )
Result : Accepted Memory : 66000 KB Time : 9984 ms
/*
* Author: Gatevin
* Created Time: 2015/3/31 14:25:53
* File Name: Rin_Tohsaka.cpp
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
Palindromic Tree的做法:
Result : Accepted Memory : 53608 KB Time : 327 ms
/*
* Author: Gatevin
* Created Time: 2015/3/31 17:08:38
* File Name: Rin_Tohsaka.cpp
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include