後綴數組
將A和B拼接後,累計分屬兩者的後綴對應的LCP-K+1即爲答案,但窮舉不是個好主意。
如果能快速求出任意兩個後綴的最長公共前綴的話,利用類似尺取法的技巧就可以在線性時間統計一段區間了。
而任意兩個後綴的最長公共前綴爲該區間的LCP值的最小值。
在掃描一段LCA>=K的區域中,如果使用單調棧維護LCP,維護棧頂使LCP最小,就可以快速得到任意爬取區域的最長公共前綴。在“尺取法”爬取的過程中,更新出棧的元素對貢獻值的影響,累積到答案中即可。
#include <iostream>
#include <string>
#include <algorithm>
const int MAX_L = 100000 + 1;
const int MAX_N = 2 * MAX_L + 1;
std::string S;
int n, k;
int sa[MAX_N + 1], lcp[MAX_N + 1]; // sa[i] := 字典序爲i的後綴的起始下標;lcp[i] := S[sa[i]...]與S[sa[i+1]...]的最長公共前綴長度
int rank[MAX_N + 1], tmp[MAX_N + 1];
// 比較(rank[i], rank[i+k])和(rank[j], rank[j+k])
bool compare_sa(const int i, const int j)
{
if (rank[i]