题意简述
一个字符串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 |
|