题意
首先给了我们一个字符串,姑且命名为文本串,然后有q个查询,对于每个查询,包含两个数l,r 询问在文本串l到r这段子串在文本串中第k次出现的首字母的位置,不满足输出-1
分析
我们首先可以想到用ac自动机,对所有查询建立一个ac自动机,然后把文本串放上面跑。可是现实打击了我们,范围太大,建字典树就超内存了。于是我们又想到后缀数组也可以处理类似问题,然后对于第k大,我们可以用主席树去维护。(当然后缀自动机也行,篛蒻的我不会)
我们可以对文本串建立后缀数组,用sa数组去建立主席树。然后对与每个查询,我们二分出左右区间(即存在查询子串的排名区间),对这个区间找第k小就行
/*后缀数组+主席树*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N = 1e5 + 100;
struct node//静态主席树节点
{
int l, r, val;
}T[N * 50];
int root[N], sa[N], tp[N], rak[N], tax[N], height[N];
/*
sa[i] 表示 排名为i的后缀的首字母位置
tp[i] 第二关键字,性质同sa
rak[i] 表示 第i个后缀的排名
tax[i] 排名为i的数量,桶
height[i] = lcp(sa[i - 1], s