题目描述
题目译自 Ukrainian Olympiads in Informatics 2023 Stage 4 Day2 T2. Масив символів і майже паліндроми
这是一个交互题。
我们称一个字符串为回文,如果它从两端读取都相同。形式上,长度为 n 的字符串 s 是回文,当且仅当对于 1≤i≤n,si=sn−i+1。例如,字符串 $\texttt{gg}, \texttt{ara}, \texttt{abacaba}, \texttt{rotator}$ 是回文,而 array,palindrome,uoi 不是。
我们称一个字符串为近似回文,如果可以通过重新排列其字符使其成为回文。例如,字符串 $\texttt{n}, \texttt{ara}, \texttt{arr}, \texttt{array}$ 是近似回文,而 palindrome,uoi,random 不是。
字符串的子串是通过删除其开头和结尾的某些(可能是零个)字符形成的字符串。
我们定义 f(s) 为字符串 s 的所有子串中,不是近似回文的最长子串的长度;如果没有这样的子串,则为 0。
给定一个长度为 n 的字符串 s,由小写拉丁字母组成。同时给定 q 个查询,每个查询形式为 li,ri。对于每个查询,计算 f(s[li…ri]) 的值,其中 s[li…ri] 表示由字符 sli,sli+1,…,sri 组成的子串。
输入格式
输入的第一行包含一个整数 n (1≤n≤2⋅105),表示字符串的长度。
第二行包含一个长度为 n 的字符串 s,由小写拉丁字母组成。
第三行包含一个整数 q (1≤q≤2⋅105),表示查询的数量。
第四行包含两个整数 l1,r1 (1≤l1≤r1≤n),表示第一个查询的参数。
后续查询的参数将由评测程序提供(见「交互方式」部分)。
交互方式
评测程序将从第二个查询开始,逐行输出两个整数 li,ri (1≤li≤ri≤n),表示当前查询的参数。
评测程序在读取到你的程序对前一个查询的回答之前,不会输出下一个查询的参数。
请确保在输出每行后调用 flush 方法。可以使用以下方式:
- C++ 中使用
fflush(stdout)、cout << endl 或 cout.flush();
- Java 中使用
System.out.flush();
- Pascal 中使用
flush(output);
- Python 中使用
sys.stdout.flush();
- 其他编程语言请参考相关文档。
输出格式
对于第 i 个查询,单独输出一行一个整数,表示所求值 f(s[li..ri])。
8
aabaaaba
3
3 7
1 8
4 4
4
6
0
在第一个样例中,需要回答三个查询:
- s[3..7]=baaab,其子串 aaab 长度为 4,不是近似回文;
- s[1..8]=aabaaaba,其子串 aabaaa 长度为 6,不是近似回文;
- s[4..4]=a,其所有子串都是近似回文。
数据范围与提示
详细子任务附加限制及分值如下表所示:
| 子任务 |
分值 |
附加限制 |
| 1 |
6 |
q=1,l1=1,r1=n, n 为偶数,s 的形式为 aabbaabbaa… |
| 2 |
9 |
q=1,l1=1,r1=n, n≤200 |
| 3 |
5 |
q=1,l1=1,r1=n, n≤5000 |
| 4 |
8 |
q=1,l1=1,r1=n |
| 5 |
10 |
s 仅包含字母 a 和 b |
| 6 |
8 |
sli=sri(对于 1≤i≤q) |
| 7 |
7 |
si=si+1(对于 1≤i<n) |
| 8 |
10 |
s 仅包含字母 $\texttt{a}, \texttt{b}, \texttt{c}, \texttt{d}, \texttt{e}, \texttt{f}$ |
| 9 |
18 |
(ri−li+1) 为奇数(对于 1≤i≤q) |
| 10 |
19 |
无附加限制 |