BZOJ 2342 Manacher
2016-12-28 15:28
148 查看
思路:
首先用manacher可以求出以i和i+1中间为对称轴,最长回文串能扩增的长度p[i]。
然后4*(y-x)能更新答案,当且仅当y≤x+p[x]/2且y-p[y]≤x。
按i-p[i]将所有点排序,依次插入set中,查询x+p[x]/2的前驱更新答案,时间复杂度O(n*logn)。
——AaronPolaris
首先用manacher可以求出以i和i+1中间为对称轴,最长回文串能扩增的长度p[i]。
然后4*(y-x)能更新答案,当且仅当y≤x+p[x]/2且y-p[y]≤x。
按i-p[i]将所有点排序,依次插入set中,查询x+p[x]/2的前驱更新答案,时间复杂度O(n*logn)。
——AaronPolaris
//By SiriusRen #include <set> #include <cstdio> #include <algorithm> using namespace std; #define N 555555 set<int>st; int l,ans,p ,mx,id,tp;char s ; struct Node{int x,y;}node ; bool cmp(Node a,Node b){return a.x<b.x;} int main(){ scanf("%d%s",&l,s+1),s[0]='%'; for(int i=1;i<=l;i++){ if(mx>i)p[i]=min(p[id*2-i],mx-i); else p[i]=0; while(s[i+p[i]+1]==s[i-p[i]])p[i]++; if(i+p[i]>mx)mx=i+p[i],id=i; } for(int i=1;i<=l;i++){ node[i].x=i-p[i],node[i].y=i; }sort(node+1,node+1+l,cmp); for(int i=1;i<=l;i++){ while(tp<l&&node[tp+1].x<=i)st.insert(node[++tp].y); ans=max(ans,(*--st.lower_bound(i+p[i]/2+1)-i)*4); }printf("%d\n",ans); }
相关文章推荐
- 【BZOJ2342】双倍回文(manacher,并查集)
- BZOJ 2342: [Shoi2011]双倍回文 manacher
- [BZOJ2342][Shoi2011]双倍回文(manacher)
- [BZOJ2342] SHOI2011 双倍回文 manacher O(n)
- BZOJ 2342([Shoi2011]双倍回文-manacher+set)
- [BZOJ2342] [Shoi2011]双倍回文(manacher)
- 【BZOJ】2342 [Shoi2011]双倍回文 manacher+set
- [bzoj2342][Shoi2011]双倍回文 manacher
- BZOJ2342 双倍回文 [manacher][set]
- BZOJ2342 Manacher + set
- BZOJ 2342 SHOI 2011 双倍回文 Manacher
- 【题解】Casting Spells LA 4975 UVa 1470 双倍回文 SDOI 2011 BZOJ 2342 Manacher
- BZOJ 2342: [Shoi2011]双倍回文 [Manacher + set]
- BZOJ 2342 Manacher
- BZOJ2342【manacher】【set】
- BZOJ2342: [Shoi2011]双倍回文【Manacher】
- BZOJ2342 [Shoi2011]双倍回文 【manacher】
- BZOJ 2342 [Shoi2011]双倍回文 Manacher
- bzoj 2342: [Shoi2011]双倍回文(manacher)
- [BZOJ2342][Shoi2011]双倍回文(manacher)