hdu 4513(Manacher)
Posted Gealo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu 4513(Manacher)相关的知识,希望对你有一定的参考价值。
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4513
题解:就是在Manacher判断回文串的过程中添加一条条件
Ma[i + dp[i] - 2] >= Ma[i + dp[i]]即可。
#include <iostream> #include <cstring> #include <cstdio> using namespace std; const int M = 1e5 + 10; int s[M] , dp[M << 1] , Ma[M << 1]; void Manacher(int len) { int l = 0; Ma[l++] = -1; Ma[l++] = 0; for(int i = 0 ; i < len ; i++) { Ma[l++] = s[i]; Ma[l++] = 0; } Ma[l] = 0; int mx = 0 , id = 0; for(int i = 0 ; i < l ; i++) { dp[i] = mx > i ? min(dp[2 * id - i] , mx - i) : 1; while(Ma[i - dp[i]] == Ma[i + dp[i]] && Ma[i + dp[i] - 2] >= Ma[i + dp[i]]) dp[i]++; if(dp[i] + i > mx) { mx = dp[i] + i; id = i; } } } int main() { int t , n; scanf("%d" , &t); while(t--) { scanf("%d" , &n); for(int i = 0 ; i < n ; i++) { scanf("%d" , &s[i]); } Manacher(n); int ans = 1; for(int i = 0 ; i < 2 * n + 2 ; i++) { ans = max(ans , dp[i] - 1); } printf("%d\n" , ans); } return 0; }
以上是关于hdu 4513(Manacher)的主要内容,如果未能解决你的问题,请参考以下文章
HDU 4513 吉哥系列故事――完美队形II(Manacher)
吉哥系列故事——完美队形II(hdu4513+Manacher)
HDU 4513 吉哥系列故事——完美队形II (Manacher变形)
HDU 4513 吉哥系列故事——完美队形II (Manacher)