Submission details
Task:Longest palindrome
Sender:ind1f
Submission time:2025-11-05 17:41:00 +0200
Language:C++ (C++17)
Status:READY
Result:ACCEPTED
Test results
testverdicttime
#1ACCEPTED0.01 sdetails
#2ACCEPTED0.01 sdetails
#3ACCEPTED0.34 sdetails
#4ACCEPTED0.19 sdetails
#5ACCEPTED0.19 sdetails
#6ACCEPTED0.20 sdetails
#7ACCEPTED0.28 sdetails
#8ACCEPTED0.19 sdetails
#9ACCEPTED0.01 sdetails
#10ACCEPTED0.01 sdetails
#11ACCEPTED0.07 sdetails
#12ACCEPTED0.01 sdetails
#13ACCEPTED0.01 sdetails
#14ACCEPTED0.01 sdetails
#15ACCEPTED0.01 sdetails
#16ACCEPTED0.12 sdetails

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...