QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#532855#2840. 绿绿与串串RainPPRRE 0ms0kbC++202.2kb2024-08-25 13:27:522024-08-25 13:27:52

Judging History

你现在查看的是最新测评结果

  • [2024-08-25 13:27:52]
  • 评测
  • 测评结果:RE
  • 用时:0ms
  • 内存:0kb
  • [2024-08-25 13:27:52]
  • 提交

answer

#include <bits/stdc++.h>

using namespace std;

#define endl '\n'

// -----------------------------------------------------------------------------

using u64 = uint64_t;

constexpr u64 p1 = 131, m1 = 13331;
constexpr u64 p2 = 13331, m2 = 1e9 + 9;

constexpr int N = 1e6 + 10;

u64 b1[N], b2[N];

void init() {
	b1[0] = b2[0] = 1;
	for (int i = 1; i < N; ++i) {
		b1[i] = b1[i - 1] * p1 % m1;
		b2[i] = b2[i - 1] * p2 % m2;
	}
}

u64 h1[N], h2[N];
u64 r1[N], r2[N];

void init(string str) {
	int n = str.size();
	h1[0] = h2[0] = 0;
	for (int i = 1; i <= n; ++i) {
		int c = str[i - 1];
		h1[i] = (h1[i - 1] * p1 % m1 + c) % m1;
		h2[i] = (h2[i - 1] * p2 % m2 + c) % m2;
	}
	r1[n + 1] = r2[n + 1] = 0;
	for (int i = n; i >= 1; --i) {
		int c = str[i - 1];
		r1[i] = (r1[i + 1] * p1 % m1 + c) % m1;
		r2[i] = (r2[i + 1] * p2 % m2 + c) % m2;
	}
}

u64 geth(u64 m, u64 *h, u64 *b, int l, int r) {
	return (h[r] - h[l - 1] * b[r - l + 1] % m + m) % m;
}

u64 get_h1(int l, int r) {
	return geth(m1, h1, b1, l, r);
}

u64 get_h2(int l, int r) {
	return geth(m2, h2, b2, l, r);
}

u64 getr(u64 m, u64 *h, u64 *b, int l, int r) {
	return (h[l] - h[r + 1] * b[r - l + 1] % m + m) % m;
}

u64 get_r1(int l, int r) {
	return getr(m1, r1, b1, l, r);
}

u64 get_r2(int l, int r) {
	return getr(m2, r2, b2, l, r);
}

bool is_req(int a, int b, int c, int d) {
	return (get_h1(a, b) == get_r1(c, d)) && (get_h2(a, b) == get_r2(c, d));
}

bool check(int n, int len) {
	if (len == n)
		return true;
	while (2 * len - 1 <= n) {
		if (!is_req(1, len, len, 2 * len - 1))
			return false;
		// [1, len] [len, 2 * len - 1]
		len = 2 * len - 1;
	}
	// [*, len] [len, n]
	if (!is_req(2 * len - n, len, len, n))
		return false;
	return true;
}

void Main(int _) {
	_ = _;
	string str;
	cin >> str;
	if (str.size() == 1) {
		cout << "1" << endl;
		return;
	}
	init(str);
	for (size_t i = 2; i <= str.size(); ++i)
		if (check((int)str.size(), i))
			cout << i << " ";
	cout << endl;
}

void Main() {
	init();
	int T;
	cin >> T;
	while (T--)
		Main(T);
}

// -----------------------------------------------------------------------------

signed main() {
	freopen("string.in", "r", stdin);
	freopen("string.out", "w", stdout);
	ios::sync_with_stdio(false);
	cin.tie(nullptr), cout.tie(nullptr);
	Main();
	return 0;
}

详细

Test #1:

score: 0
Dangerous Syscalls

input:

7
abcdcb
qwqwq
qaqaqqq
carnation
c
ab
aa

output:


result: