【Tjoi2016&Heoi2016】字符串
问题描述
佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物。生日礼物放在一个神奇的箱子中。箱子外边写了一个长为n的字符串s,和m个问题。佳媛姐姐必须正确回答这m个问题,才能打开箱子拿到礼物,升职加薪,出任CEO,嫁给高富帅,走上人生巅峰。每个问题均有a,b,c,d四个参数,问你子串s[a..b]的所有子串和s[c..d]的最长公共前缀的长度的最大值是多少?佳媛姐姐并不擅长做这样的问题,所以她向你求助,你该如何帮助她呢?
输入格式
输入的第一行有两个正整数n,m,分别表示字符串的长度和询问的个数。接下来一行是一个长为n的字符串。接下来m行,每行有4个数a,b,c,d,表示询问s[a..b]的所有子串和s[c..d]的最长公共前缀的最大值。
输出格式
对于每一次询问,输出答案。
样例输入
5 5
aaaaa
1 1 1 5
1 5 1 1
2 3 2 3
2 4 2 3
2 3 2 4
样例输出
1
1
2
2
2
提示
1<=n,m<=100,000,字符串中仅有小写英文字母,a<=b,c<=d,1<=a,b,c,d<=n
此题思路比较直接,考虑到直接搞的麻烦,考虑二分答案,那么问题可以转化成求$[a,b-mid+1]$中是否存在一个位置开始的后缀与以$c$为开头的后缀的最长公共前缀大于$mid$
考虑如何判断,考虑SA数组,显然与c开头的后缀最长公共前缀大于$mid$的后缀在SA数组中是连续的一个区间,那么问题即是求是否存在以$[a,b-mid+1]$开头的后缀在SA数组中的位置恰好在上述区间中,那么用主席树维护每个位置对应$SA$数组中出现位置的情况,直接查找即可。
关于找出区间,RMQ处理Height数组,然后倍增查找即可。
代码:
1 |
|