题目描述
小 Y 是一名大学生,最近正在研究字符中方向的问题。
小 Y 了解到关于字等中的如下定义:
- 给定一个长度为 n 的字符中 s[1:n],我们定义其子串 s[l:r](1≤l≤r≤n)为选择 s[l],s[l+1],…,s[r], 将其顺次拼接得到的新字符串。
- 给定一个长度为 n 的字符中 s[1:n],我们定义其翻转后的结果 R(s) 为将 s[n],s[n−1],…,s[1] 顺次拼接,也就是将字符串反序拼接得到的字符串。
- 给定两个长度均为 n 的字符串 a[1:n],b[1:n],我们定义 a 的字典序小于 b 当且仅当存在 1≤i≤n,使得对于任意 1≤j<i,a[j]=b[j],且 a[i]<b[i]。
在了解了上述定义后,小 Y 想到了这样的问题:
给定一个长度为 n 的字符串 s[1:n]。有 q 次询问,每次询问给定两个参数 i,r。你需要求出有多少 l,满足如下条件:
- 1≤l≤r。
- s[i:i+l−1] 字典序小于 R(s[i+l:i+2l−1])。
小 Y 想求助你帮忙解决这一问题。
输入格式
从文件 string.in
中读入数据。
本题有多组测试数据。
输入的第一行包含两个整数 c,t,分别表示测试点编号和测试数据组数。c=0 表示该测试点为样例。
接下来依次输入每组测试数据,对于每组测试数据:
输入的第一行包含两个正整数 n,q,表示子符串长度和询问次数。
输入的第二行包含一个长度为 n 的仅包含小写字母的字符串 s。
输入的接下来 q 行,每行包含两个正整数 i,r。表示一次询问,保证 i+2r−1≤n。
输出格式
输出到文件 string.out
中。
对于每一组测试数据的每一次询问,输出一行一个整数,表示满足条件的 l 的个数。
0 2
9 3
abacababa
1 4
2 4
3 3
9 3
abaabaaba
1 4
2 4
3 3
4
0
3
2
0
2
样例 1 解释
对于第一组数据的第一组询问:
- l=1 时,s[i:i+l−1]=a,R(s[i+l:i+2l−1])=b。
- l=2 时,s[i:i+l−1]=ab,R(s[i+l:i+2l−1])=ca。
- l=3 时,s[i:i+l−1]=aba,R(s[i+l:i+2l−1])=bac。
- l=4 时,s[i:i+l−1]=abac,R(s[i+l:i+2l−1])=baba。
这四种情况中,s[i:i+l−1] 的字典序均小于 R(s[i+l:i+2l−1])。因此答案为 4。
样例 2
见选手目录下的 string2.in
与 string2.ans
。
该样例数据范围满足测试点 5。
样例 3
见选手目录下的 string3.in
与 string3.ans
。
样例 4
见选手目录下的 string4.in
与 string4.ans
。
该样例数据范围满足测试点 24∼25。
数据范围
对于所有测试数据保证:1≤t≤5,1≤n≤105,1≤q≤105,1≤i+2r−1≤n,字符串 s 仅包含小写字母。
测试点编号 |
n≤ |
q≤ |
特殊性质 |
1 |
5 |
A |
2 |
10 |
3 |
20 |
4 |
50 |
5 |
102 |
6 |
103 |
无 |
7 |
2,000 |
8 |
3,000 |
9 |
4,000 |
10 |
23,333 |
A |
11 |
5×104 |
12 |
75,000 |
13 |
9×104 |
14 |
105 |
15 |
23,333 |
B |
16 |
75,000 |
17 |
9×104 |
18 |
105 |
19 |
23,333 |
无 |
20 |
5×104 |
21 |
75,000 |
22 |
9×104 |
23 |
95,000 |
24∼25 |
105 |
特殊性质 A:保证字符串中仅包含字符 a 和 b,且每个字符独立等概率地在 a 和 b 中选择。
特殊性质 B:保证字符串中的相邻字符互不相同。