毒瘤数据怎么破?93pts求助
查看原帖
毒瘤数据怎么破?93pts求助
406941
Register_int-std=c++14楼主2021/4/28 22:02

我真的是吐了…… 代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int n,q,len,tot,prime[500010],minp[500010];
ull h[500010],p[500010];
char s[500010];
inline int read() {
    int x = 0,f = 1;
	char c = getchar();
    while(c < '0' || c > '9'){
	 	if(c == '-') f = -1;
		c = getchar();
	}
    while(c >= '0' && c <= '9'){
		x = (x << 1) + (x << 3) + c - '0';
		c = getchar();
	}
    return x * f;
}
inline void h_write(int x) {
    if(x < 0) putchar('-'),x = -x;
    if(x < 10) {
    	putchar(x + '0');
    	return;
	}
	h_write(x / 10),putchar(x % 10 + '0');
}
inline void write(int x){
	h_write(x),puts("");
}
void parse() {
    for(int i = 2; i <= n; i++) {
        if(!minp[i]) prime[++tot] = i,minp[i] = i;
        for(int j = 1; j <= tot; j++) {
            if(prime[j] > minp[i] || prime[j] * i > n) break;
            minp[prime[j] * i] = prime[j];
        }
    }
    p[0] = 1;
    for(int i = 1; i <= n; i++) h[i] = h[i - 1] * 131 + s[i],p[i] = p[i - 1] * 131;
}
bool valid(int a,int b,int l) {
    return h[b] - h[a + l - 1] * p[len - l] == h[a + (len / l - 1) * l - 1] - h[a - 1] * p[len - l];
}
int main() {
    n = read(),gets(s + 1),q = read();
    parse();
    while(q--) {
        int a,b,ans,t;
        a = read(),b = read();
        len = t = ans = b - a + 1;
        while(t - 1) {
            int t1 = minp[t];
            while(t % t1 == 0 && valid(a,b,ans / minp[t])) t /= t1,ans /= t1;
            while(t % t1 == 0) t /= t1;
        }
        write(ans);
    }
    return 0;
}
/*
Input:
8
aaabcabc
3
1 3
3 8
4 8
Output:
1
3
5
*/
2021/4/28 22:02
加载中...