Description
给出一个由小写英文字母组成的字符串S,再给出q个询问,要求回答S某个子串的最短循环节。
如果字符串B是字符串A的循环节,那么A可以由B重复若干次得到。
Input
第一行一个正整数n (n<=500,000),表示S的长度。
第二行n个小写英文字母,表示字符串S。
第三行一个正整数q (q<=2,000,000),表示询问个数。
下面q行每行两个正整数a,b (1<=a<=b<=n),表示询问字符串S[a..b]的最短循环节长度。
Output
依次输出q行正整数,第i行的正整数对应第i个询问的答案。
Sample Input
8 aaabcabc 3 1 3 3 8 4 8
Sample Output
1 3 5
分析
分析题目得
1.ans一定是区间长度的约数
2.[l, r - ans]和[l + ans, r]相同
搞清楚这两点就比较清晰了
对于第一条可以直接暴力gcd,如果想要优化的话可以考虑线性筛法
对于第二条直接使用hash
代码
#include<bits/stdc++.h>
using namespace std;
int n, q;
char s[500010];
unsigned long long f[500010], p[500010], b =