2 3 51 52 51 4 51 52 52 51
3 4
#include<stdio.h> #include<iostream> #include<math.h> #include<stdlib.h> #include<ctype.h> #include<algorithm> #include<vector> #include<string> #include<queue> #include<stack> #include<set> #include<map> using namespace std; const int MAXN = 2000100; int n, t, ans; int s[MAXN]; int ma[MAXN * 2]; int mp[MAXN]; void manacher() { int l = 0; ma[l++] = 99999999; ma[l++] = 1000000000; for (int i = 0; i < n; i++) { ma[l++] = s[i]; ma[l++] = 1000000000; } ma[l] = 88888888; int mx = 0, id = 0; for (int i = 0; i < l; i++) { mp[i] = mx>i ? min(mp[2 * id - i], mx - i) : 1; int m = ma[i]; while (ma[i + mp[i]] == ma[i - mp[i]] && ma[i-mp[i]] <= ma[i-mp[i]+2]) mp[i]++; if (i + mp[i] > mx) { mx = i + mp[i]; id = i; } } } int main() { scanf("%d", &t); while (t--) { ans = 0; memset(s, 0, sizeof(s)); memset(mp, 0, sizeof(mp)); scanf("%d", &n); for (int i = 0; i < n; i++) scanf("%d", &s[i]); manacher(); for (int i = 0; i < n*2+1;i++) ans = max(ans, mp[i] - 1); printf("%d\n", ans); } return 0; }
#include<stdio.h> #include<iostream> #include<math.h> #include<stdlib.h> #include<ctype.h> #include<algorithm> #include<vector> #include<string> #include<queue> #include<stack> #include<set> #include<map> using namespace std; const int MAXN = 2000100; int n, t, ans; int s[MAXN]; int ma[MAXN * 2]; int mp[MAXN]; void manacher() { int l = 0; ma[l++] = 99999999; ma[l++] = 1000000000; for (int i = 0; i < n; i++) { ma[l++] = s[i]; ma[l++] = 1000000000; } ma[l] = 88888888; int mx = 0, id = 0; for (int i = 0; i < l; i++) { mp[i] = mx>i ? min(mp[2 * id - i], mx - i) : 1; int m = ma[i]; while (ma[i + mp[i]] == ma[i - mp[i]]) { if (ma[i + mp[i]] == 1000000000) { mp[i]++; continue; } if (m >= ma[i + mp[i]]) { m = ma[i + mp[i]]; mp[i]++;//两行的顺序不能反,因为这里WA了几发 } else break; } if (i + mp[i] > mx) { mx = i + mp[i]; id = i; } } } int main() { scanf("%d", &t); while (t--) { ans = 0; memset(s, 0, sizeof(s)); memset(mp, 0, sizeof(mp)); scanf("%d", &n); for (int i = 0; i < n; i++) scanf("%d", &s[i]); manacher(); for (int i = 0; i < n*2+1;i++) ans = max(ans, mp[i] - 1); printf("%d\n", ans); } return 0; }