回文串是一种“对称”的字符串,若字符串 s 是一个回文串,则 s 满足 s=reverse(s) ,其中 reverse(s) 表示字符串 s 的翻转。
cyy非常喜欢回文串,今天他掏出了一个构造回文串的算法:
-
在第 1 步,字符串为 p1=c1。
-
在第 k 步,字符串为 pk=pk−1+ck+pk−1 ,其中 + 表示字符串之间的连接。
上述算法中的 ci 表示一个未知字符,这样的字符一共有 k 种,分别为 c1,c2,...,ck 。
就在cyy开心地构造着回文串时,毒瘤的JM想起了最长公共子串问题,和这个回文串结合了一下,弄出了一道毒瘤(其实并不)题:
为便于描述,规定 s[l, r] 表示 s 的子串 slsl+1...sr ,其中 si 表示 s 的第 i 个字符,且 i∈[1, ∣s∣],其中 ∣s∣ 表示 s 的长度。例如 s= abcde,则 s[2, 3]= bc。
给定 q 次询问,每次给定五个正整数 k, l1, r1, l2, r2 ,求 pk 的两个子串 pk[l1, r1] 和 pk[l2, r2] 的最长公共子串的长度是多少。
例如 k=3 ,则 p3= abacaba,那么:
p3[1, 2] 和 p3[4, 5] 的最长公共子串为a,其长度为 1 ;
p3[1, 4] 和 p3[3, 6] 的最长公共子串为ab或ac,其长度为 2 。