Kevin_Zhang

Untitled

Oct 11th, 2021 (edited)
597
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.53 KB | None | 0 0
  1. #include <stdio.h>
  2.  
  3. #define MAX_N 300010
  4. #define inf (int)(1e9)
  5.  
  6. int st[MAX_N], man[MAX_N], vl[MAX_N], vr[MAX_N], n, tmp[MAX_N], cmx[MAX_N];
  7.  
  8. int max(int a, int b) { return a < b ? b : a; }
  9. int min(int a, int b) { return a < b ? a : b; }
  10.  
  11. void swap(int *a, int *b) {
  12.     int c = *b;
  13.     *b = *a, *a = c;
  14. }
  15.  
  16. void reverse(int *l, int *r) {
  17.     while (l < r) swap(l, r-1), ++l, --r;
  18. }
  19.  
  20. void getv(int v[]) {
  21.     int m = 0;
  22.     tmp[m++] = -1;
  23.     for (int i = 0;i < n;++i)
  24.         tmp[m++] = st[i], tmp[m++] = -1;
  25.  
  26.     // manacher
  27.     for (int l = -1, r = -1, i = 0;i < m;++i) {
  28.         man[i] = 1;
  29.         if (r >= i) man[i] = min(r - i + 1, man[l + r - i]);
  30.         while (i + man[i] < m && i - man[i] >= 0 && tmp[i-man[i]] == tmp[i+man[i]])
  31.             ++man[i];
  32.         if (i + man[i] - 1 >= r)
  33.             l = i - man[i] + 1, r = i + man[i] - 1;
  34.     }
  35.  
  36.     for (int i = 0;i < m;++i) cmx[i] = 0;
  37.  
  38.     for (int i = 0;i < m;++i) {
  39.         int l = i - man[i] + 1, wid = man[i] * 2 - 1;
  40.         cmx[l] = max(cmx[l], wid);
  41.     }
  42.     for (int i = 1;i < m;++i)
  43.         cmx[i] = max(cmx[i], cmx[i-1] - 2);
  44.  
  45.     for (int i = 0;i < m;++i) {
  46.         int l = i/2, wid = (cmx[i]-1)/2;
  47.         v[l] = max(v[l], wid);
  48.     }
  49. }
  50.  
  51. int main() {
  52.     while (scanf("%d", st+n) != EOF) ++n;
  53.  
  54.     getv(vl);
  55.     reverse(st, st+n);
  56.     getv(vr);
  57.     reverse(st, st+n);
  58.     reverse(vr, vr+n);
  59.  
  60.     int res = 0, beg = 0;
  61.     for (int i = 1;i < n;++i) {
  62.         if (vl[i] + vr[i-1] > res || vl[i]+vr[i-1]==res && i-vr[i-1]>beg)
  63.             res = vl[i] + vr[i-1], beg = i - vr[i-1];
  64.     }
  65.  
  66.     for (int i = 0;i < res;++i) {
  67.         printf("%d", st[i+beg]);
  68.         if (i+1 < res) printf(" ");
  69.     }
  70.     puts("");
  71. }
  72.  
Add Comment
Please, Sign In to add comment