写在前面:
大佬们如果像我一样觉得题解有点玄学不想写,可以看看这个更玄学的解法
思路:
问:三元组ABC如何得到?
一个A,一个B。一个C
如果我们把一个字符串A从中间切一刀
左半边叫做T,右半边叫做S
那么A中的一个三元组可能有以下几种情况:
- T中取出一个三元组,S打酱油
- T中取出一个AB,S取出一个C
- T中取出一个A,S取出一个BC
- T打酱油,S中取出一个三元组
这里的ABC均可以通过?获得
框架:
我们可以递归处理题目给出的字符串S
假定S长度为n,则我们可以
void merge(int id, int l, int r) {
//和线段树一样,初始为(1,1,n)
if(l == r) {
... }
int mid = l + r >> 1;
merge(id << 1, l, mid);
merge