题意简述
一个字符串S,长度5000(时间空间都够平方做),只有’a’和’b’两个字符组成。一个字符串A是“半回文”的,当且仅当,对于所有的奇数$i<=(|A|+1)/2$,满足A的正数第$i$个和$A$的倒数第$i$个相等。
请你求出,$S$的所有半回文的子串中,字典序排序第$k$位的是哪个。
思路框架
$dp$求出哪些子串是半回文的,加入到TRIE树中,用类似二叉查找树的方法找到第$k$个即珂。
具体思路
$dp[l][r]$表示$[l,r]$这一段子串是否是“半回文”的。如果$s[l]==s[r]$,才有珂能半回文,否则直接设为$0$。
如果l+2>=r-2,那么只需要满足$s[l]==s[r]$,就是半回文了。
否则,还需要使$dp[l+2][r-2]$为真,$dp[l][r]$才为真。
然后TRIE树上记录一个子树和。设指向字符’a’的是左儿子,’b’是右儿子。由于’a’的字典序小于’b’,所以,如果左儿子的size<=k,那么第$k-num[leftson]$个就在左子树里面。否则,就在右子树里面找第$k-num[rightson]$即珂。其中$num[u]$表示节点$u$是否表示一个半回文串。
代码:
1 |
|