QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#532855 | #2840. 绿绿与串串 | RainPPR | RE | 0ms | 0kb | C++20 | 2.2kb | 2024-08-25 13:27:52 | 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