| Task: | Longest palindrome |
| Sender: | ind1f |
| Submission time: | 2025-11-05 17:41:00 +0200 |
| Language: | C++ (C++17) |
| Status: | READY |
| Result: | ACCEPTED |
| test | verdict | time | |
|---|---|---|---|
| #1 | ACCEPTED | 0.01 s | details |
| #2 | ACCEPTED | 0.01 s | details |
| #3 | ACCEPTED | 0.34 s | details |
| #4 | ACCEPTED | 0.19 s | details |
| #5 | ACCEPTED | 0.19 s | details |
| #6 | ACCEPTED | 0.20 s | details |
| #7 | ACCEPTED | 0.28 s | details |
| #8 | ACCEPTED | 0.19 s | details |
| #9 | ACCEPTED | 0.01 s | details |
| #10 | ACCEPTED | 0.01 s | details |
| #11 | ACCEPTED | 0.07 s | details |
| #12 | ACCEPTED | 0.01 s | details |
| #13 | ACCEPTED | 0.01 s | details |
| #14 | ACCEPTED | 0.01 s | details |
| #15 | ACCEPTED | 0.01 s | details |
| #16 | ACCEPTED | 0.12 s | details |
Code
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int N = 1e6 + 5;
const int P = 29;
const int MOD = 1e9 + 7;
void add(int &a, int b) {
a += b;
if (a >= MOD) {
a -= MOD;
}
}
void sub(int &a, int b) {
a -= b;
if (a < 0) {
a += MOD;
}
}
int mul(int a, int b) {
return 1LL * a * b % MOD;
}
int n;
string a, b;
int pp[N];
int hh[N], kk[N];
int get_a(int l, int r) {
if (l == 0) {
return hh[r];
}
int res = hh[r];
sub(res, mul(hh[l - 1], pp[r - l + 1]));
return res;
}
int get_b(int l, int r) {
if (l == 0) {
return kk[r];
}
int res = kk[r];
sub(res, mul(kk[l - 1], pp[r - l + 1]));
return res;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
pp[0] = 1;
for (int i = 1; i < N; i++) {
pp[i] = mul(P, pp[i - 1]);
}
cin >> a;
b = a;
reverse(b.begin(), b.end());
n = b.size();
for (int i = 0; i < n; i++) {
hh[i] = (i > 0 ? hh[i - 1] : 0);
hh[i] = mul(hh[i], P);
add(hh[i], a[i] - 'a' + 1);
kk[i] = (i > 0 ? kk[i - 1] : 0);
kk[i] = mul(kk[i], P);
add(kk[i], b[i] - 'a' + 1);
}
int ll = -1, rr = -2;
for (int i = 0; i < n; i++) {
int lo = 1, hi = min(i + 1, n - i), ans = -1;
while (lo <= hi) {
int mid = (lo + hi) >> 1;
if (get_a(i - mid + 1, i) == get_b(n - 1 - (i + mid - 1), n - 1 - i)) {
ans = mid;
lo = mid + 1;
} else {
hi = mid - 1;
}
}
if (ans * 2 - 1 > rr - ll + 1 && ans != -1) {
ll = i - ans + 1;
rr = i + ans - 1;
}
}
for (int i = 0; i < n - 1; i++) {
if (a[i] == a[i + 1]) {
int lo = 1, hi = min(i + 1, n - i - 1), ans = -1;
while (lo <= hi) {
int mid = (lo + hi) >> 1;
if (get_a(i - mid + 1, i) == get_b(n - 1 - (i + mid), n - 1 - i - 1)) {
ans = mid;
lo = mid + 1;
} else {
hi = mid - 1;
}
}
if (ans * 2 > rr - ll + 1 && ans != -1) {
ll = i - ans + 1;
rr = i + 1 + ans - 1;
}
}
}
cout << a.substr(ll, rr - ll + 1) << '\n';
return 0;
}
Test details
Test 1
Verdict: ACCEPTED
| input |
|---|
| aaaaaaaaaa |
| correct output |
|---|
| aaaaaaaaaa |
| user output |
|---|
| aaaaaaaaaa |
Test 2
Verdict: ACCEPTED
| input |
|---|
| ababababab |
| correct output |
|---|
| ababababa |
| user output |
|---|
| ababababa |
Test 3
Verdict: ACCEPTED
| input |
|---|
| aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa... |
| correct output |
|---|
| aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa... |
| user output |
|---|
| aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa... |
Test 4
Verdict: ACCEPTED
| input |
|---|
| ababababababababababababababab... |
| correct output |
|---|
| ababababababababababababababab... |
| user output |
|---|
| ababababababababababababababab... |
Test 5
Verdict: ACCEPTED
| input |
|---|
| aztdvxzjwxtrludymvpradgbdpgnrq... |
| correct output |
|---|
| aztdvxzjwxtrludymvpradgbdpgnrq... |
| user output |
|---|
| aztdvxzjwxtrludymvpradgbdpgnrq... |
Test 6
Verdict: ACCEPTED
| input |
|---|
| vvfigwwsyxbukedgcfyibvtbclybud... |
| correct output |
|---|
| vvfigwwsyxbukedgcfyibvtbclybud... |
| user output |
|---|
| vvfigwwsyxbukedgcfyibvtbclybud... |
Test 7
Verdict: ACCEPTED
| input |
|---|
| abaabaaaaaaabaababbbbbbabaaabb... |
| correct output |
|---|
| babbbabbbaabbbbaabbbbbbbbaabbb... |
| user output |
|---|
| babbbabbbaabbbbaabbbbbbbbaabbb... |
Test 8
Verdict: ACCEPTED
| input |
|---|
| txolestmgyepwrpofxyesjtsfkhjac... |
| correct output |
|---|
| yxnbaabnxy |
| user output |
|---|
| yxnbaabnxy |
Test 9
Verdict: ACCEPTED
| input |
|---|
| ihpohpzoffel |
| correct output |
|---|
| ff |
| user output |
|---|
| ff |
Test 10
Verdict: ACCEPTED
| input |
|---|
| flexflexvpqxierullgcfckjqflexf... |
| correct output |
|---|
| cfc |
| user output |
|---|
| cfc |
Test 11
Verdict: ACCEPTED
| input |
|---|
| aabbabaabbaababbabaababbaabbab... |
| correct output |
|---|
| abaababbaabbabaababbabaabbaaba... |
| user output |
|---|
| abaababbaabbabaababbabaabbaaba... |
Test 12
Verdict: ACCEPTED
| input |
|---|
| obsession |
| correct output |
|---|
| ses |
| user output |
|---|
| ses |
Test 13
Verdict: ACCEPTED
| input |
|---|
| abcxcbaxcba |
| correct output |
|---|
| abcxcba |
| user output |
|---|
| abcxcba |
Test 14
Verdict: ACCEPTED
| input |
|---|
| zzabc |
| correct output |
|---|
| zz |
| user output |
|---|
| zz |
Test 15
Verdict: ACCEPTED
| input |
|---|
| aaccaabbaaccaaccaabbaaccaa |
| correct output |
|---|
| aaccaabbaaccaaccaabbaaccaa |
| user output |
|---|
| aaccaabbaaccaaccaabbaaccaa |
Test 16
Verdict: ACCEPTED
| input |
|---|
| aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa... |
| correct output |
|---|
| aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa... |
| user output |
|---|
| aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa... |
