bzoj2565 最长双回文串
2017-09-17 11:34
351 查看
传送门
manacher+奇怪的递推(我也不清楚这算不算递推)0.0
大体思路是记录能到达每个字符的最早的对称中心,然后根据在manacher的时候用当前回文串和前面相邻的回文串来更新答案就好了(我边界问题处理了好久,然而1A开森)
CODE:
manacher+奇怪的递推(我也不清楚这算不算递推)0.0
大体思路是记录能到达每个字符的最早的对称中心,然后根据在manacher的时候用当前回文串和前面相邻的回文串来更新答案就好了(我边界问题处理了好久,然而1A开森)
CODE:
#include<cstdio> #define N 100005 char s[N<<1]; int p[N<<1],a[N<<1]; int len,mx,pos,ans; inline int max(const int &a,const int &b){return a>b?a:b;} inline int min(const int &a,const int &b){return a<b?a:b;} inline void getstring() { char c=getchar(); while(c<'a'||c>'z') c=getchar(); while(c>='a'&&c<='z') s[++len]='#',s[++len]=c,c=getchar(); s[0]='$',s[len+1]=s[len+2]='#'; } int main() { getstring(); for(int i=1;i<=len;i++) { if(mx>i) p[i]=min(p[pos*2-i],mx-i); else p[i]=1; if(!a[i+p[i]]) a[i+p[i]]=i; ans=max(ans,i-a[i-p[i]]); while(s[i+p[i]]==s[i-p[i]]) { if(!a[i+p[i]]) a[i+p[i]]=i; ans=max(ans,i-a[i-p[i]]); p[i]++; } if(i+p[i]>mx) mx=i+p[i],pos=i; } printf("%d",ans); return 0; }
相关文章推荐
- bzoj 2565: 最长双回文串 manacher
- bzoj 2565 最长双回文串 - Manacher
- bzoj 2565: 最长双回文串 manacher算法
- Bzoj2565:最长双回文串:回文自动机
- bzoj 2565: 最长双回文串 回文自动机
- bzoj 2565: 最长双回文串
- BZOJ 2565 最长双回文串 (Manacher)
- 最长双回文串 bzoj 2565 回文自动机
- 【BZOJ2565】最长双回文串 Manacher
- BZOJ——2565最长双回文串
- [bzoj2565]最长双回文串 manacher
- BZOJ 2565: 最长双回文串 manacher
- BZOJ 2565 最长双回文串
- BZOJ[2565]最长双回文串 Manacher
- BZOJ2565:最长双回文串(回文自动机)
- 【bzoj2565】最长双回文串
- BZOJ 2565: 最长双回文串 [Manacher]
- [bzoj 2565] 最长双回文串
- bzoj2565 最长双回文串
- BZOJ 2565 最长双回文串 哈希+二分+线扫+树状数组