HDU 4513 吉哥系列故事——完美队形II(manacher模板)
2015-04-02 20:05
447 查看
中文题面,大概算得上模板题...不过在模板的while部分加上限制条件即可..因为是整数数组,都是正数,所以manacher模板里的#,?,\0什么的可以修改为-1 -2 -3...题目让判断回文从左到中间非递减,那么如果是以i为中心,那么b[i-1]和b[i+1]如果回文就是相等的,并且假定b[i-x]非负,那么b[i-x+2]>=b[i-x]对于所有x都符合情况。所以加上这个限制条件即可...
#include"cstdio" #include"iostream" #include"cstring" #include"algorithm" #define N 110005 using namespace std; int a ,b[N*2]; int rad[N*2]; // rad[i]代表以i为中心的最大回文半径 int main() { int t; cin>>t; for(int cas=1;cas<=t;cas++) { //以下标1读入方便使用 int maxl,maxid,id; int i,len; scanf("%d",&len); for(int i=1;i<=len;i++) scanf("%d",&a[i]); for(i=1;i<=len;i++) { // 插入'#' 使得所有回文串为奇数 b[i*2]=a[i]; b[i*2+1]=-1; } len=2*i;b[0]=-2; b[1]=-1; b[len]=-3; // 防越界 头尾区别 maxid=id=0; maxl=0; for(i=1;i<len;i++) { if(maxid>i) rad[i]=min(rad[2*id-i],maxid-i); // 利用对称性优化复杂度 else rad[i]=1; while(b[i-rad[i]]==b[i+rad[i]]) { //对于当前点 搜索半径 if(b[i-rad[i]]>0&&b[i-rad[i]]>b[i-rad[i]+2]) break; rad[i]++; } if(rad[i]+i>maxid) { maxid=rad[i]+i; id=i; } if(rad[i]>maxl) maxl=rad[i]; } printf("%d\n",maxl-1); } return 0; }
相关文章推荐
- hdu 4513 吉哥系列故事——完美队形II ( manacher+dp )
- HDU 4513 吉哥系列故事——完美队形II (Manacher变形)
- HDU 4513 吉哥系列故事——完美队形II(Manacher)
- HDU 4513 吉哥系列故事 完美队形II (manacher)
- HDU 4513 吉哥系列故事――完美队形II(Manacher)
- HDU 4513 吉哥系列故事――完美队形II(Manacher)
- HDU - 4513 吉哥系列故事――完美队形II(manacher)
- HDU - 4513 吉哥系列故事――完美队形II(manacher)
- HDU 4513 吉哥系列故事――完美队形II(manacher)
- HDU 3613 吉哥系列故事――完美队形II(Manacher模板稍加改动)
- HDU 4513 吉哥系列故事——完美队形II(Manacher算法最大回文长度 && 两侧沿中点递减)
- hdu 4513 吉哥系列故事――完美队形II(Manacher算法求回文串长度)
- hdu----(4513)吉哥系列故事——完美队形II(manacher(最长回文串算法))
- hdu 4513 吉哥系列故事——完美队形II(manacher)
- Hdu 4513 吉哥系列故事——完美队形II (manacher变形)
- HDU 4513 吉哥系列故事——完美队形II(Manacher)
- HDU---4513-吉哥系列故事――完美队形II (manacher)
- HDU 4513 吉哥系列故事——完美队形II
- HDU 4513 吉哥系列故事——完美队形II(Manacher)
- hdu-4513 吉哥系列故事——完美队形II 【Manacher】