二分+哈希44pts求助
查看原帖
二分+哈希44pts求助
497711
EnriqueYXH楼主2022/11/15 20:35

rt,应该不是模数的问题,也#define int ll了,不是很明白为什么A不了

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#define int ll
#define up(i, a, b) for (int i = a; i <= b; i++)
#define dn(i, a, b) for (int i = a; i >= b; i--)
using namespace std;
typedef long long ll;
int read() {
	int x = 0, f = 1;
	char ch = getchar();
	while (ch < '0' || ch > '9') {if (ch == '-') f = -1;ch = getchar();}
	while (ch >= '0' && ch <= '9') {x = (x << 1) + (x << 3) + (ch ^ 48);ch = getchar();}
	return x * f;
}
const int N = 5e5 + 5, base = 131, mod = 998244353;
int n, m, pw[N], pre[N], suf[N];
char val[N], vec[N];
int hs1(int l, int len) {
	return (pre[l + len - 1] - ((ll)pre[l - 1] * pw[len] % mod) + mod) % mod;
}
int hs2(int r, int len) {
	return (suf[r - len + 1] - ((ll)suf[r + 1] * pw[len] % mod) + mod) % mod;
}
int find(int L, int R) {
	int l = 1, r = ((R - L + 1) >> 1), len = 1;
	while (l <= r) {
		int mid = (l + r) >> 1;
		if (hs1(l, mid) == hs2(r, mid)) len = mid, l = mid + 1;
		else r = mid - 1;
	}
	return len;
}
signed main() {
	n = read();
	up(i, 1, n) {
		char op[2];
		scanf("%s", op);
		val[i] = *op;
	}
	pw[0] = 1;
	up(i, 1, n) pw[i] = (ll)pw[i - 1] * base % mod;
	up(i, 1, n) pre[i] = ((ll)pre[i - 1] * base % mod + val[i]) % mod;
	dn(i, n, 1) suf[i] = ((ll)suf[i + 1] * base % mod + val[i]) % mod;
	int a = 1, b = n;
	while (a <= b) {
		if (val[a] == val[b]) {
			int len = find(a, b);
			if (val[a + len] <= val[b - len]) vec[++m] = val[a++];
			else vec[++m] = val[b--];
		}
		else {
			if (val[a] < val[b]) vec[++m] = val[a++];
			else vec[++m] = val[b--];
		}
	}
	up(i, 1, m) {
		putchar(vec[i]);
		if (!(i % 80)) puts("");
	}
	return 0;
}
2022/11/15 20:35
加载中...