题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4513
题意比最长回文串就多了一个前面的人要比后面的人低这个条件,所以在p[i]++的时候判断一下s[i-p[i]]<=s[i-p[i]+2]就可以了;
用最长回文串算法manacher:套一下模板就可以了;
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int N = 2e5+7; int p[N]; int s[N]; int Manacher(int s[], int n) { int Id=0, mx = 0, ans = 0; for(int i=2; i<n; i++) { if(mx > i) p[i] = min(p[Id*2-i], mx-i); else p[i] = 1; while(s[i+p[i]] == s[i-p[i]] && s[i-p[i]]<=s[i-p[i]+2] )///要满足的条件是前面的要小于后面的人所以要这样写; p[i]++; if(mx < p[i]+i) { mx = p[i]+i; Id = i; } ans = max(ans, p[i]); } return ans - 1; } int main() { int T, n; scanf("%d", &T); while(T--) { scanf("%d", &n); for(int i=0; i<n; i++) scanf("%d", &s[i]); for(int i=n; i>=0; i--) { s[i+i+2] = s[i]; s[i+i+1] = 0; } s[0] = 1; int ans = Manacher(s, 2*n+2); printf("%d\n", ans); } return 0; }
时间: 2024-10-13 00:00:28