bzoj 3145 [Feyat cup 1.5]Str
权限题 这题暴力就是两个串分别枚举点 \(i,j\) ,假设这两个点不同,那么剩下的部分就是尽量越长越好,所以这部分答案就是第一个串 \(i-1\) 前缀和第二个串 \(j-1\) 前缀的 \(lcs\) +第一个串 \(i+1\) 后缀和第二个串 \(j+1\) 后缀的 \(lcp\) +1 考虑把两个串接起来,中间用个没用过的字符隔开,那么两个串前缀的 \(lcs\) 就可以先在前缀树上找到对应的两个点,然后就是两点 \(lca\) 的 \(length\) .后缀的 \(lcp\) 也类似.那么答案就是 \(\max (lcs(a_{i-1},a_{j-1})+lcp(b_{i+1},b_{j+1}))\) ,其中 \(a_i\) 为某前缀在前缀树上对应点, \(b_i\) 为后缀在后缀树上对应点 所以这个问题变成了询问所有点对在两棵树上lca深度和的最大值.可以dfs第一棵树,然后处理第一棵树上lca为 \(x\) 的点对,每次把儿子内点在第二棵树的信息合并过来,就能求解.首先,两个子树合并,为了保证复杂度,需要启发式合并,然后在合并时算贡献.现在就是要知道某个点和一个点集内点在第二棵树上的lca最大深度,容易发现一定和dfs序相邻的点lca最深.所以一个点维护的是子树内点在第二棵树上以dfs序为关键字的set,每次二分查找前驱后继即可 #include<bits/stdc