[bzoj 2565] 最长双回文串

27 篇文章 0 订阅

似乎把这题些颓了。

Manacher预处理,得到g[]数组。

之后蒟蒻就开始无脑的用数据结构大法了。。。

慢得飞起尴尬

#include <map>
#include <cstdio>
#include <cstring>
#include <algorithm>
 
using namespace std;
char S[200005];
int minx[800005],tip[800005],g[200005];
int maxl,p,i,N,n,t,ans;
 
void Manacher(){
  maxl=0; p=0; g[0]=0;
  for (i=1;i<N;i++){
    if (maxl>=i){
      if (i+g[p*2-i]<maxl) g[i]=g[p*2-i];
        else g[i]=maxl-i;
    } else g[i]=0;
    while (S[i-g[i]-1]==S[i+g[i]+1]) g[i]++;
    if (maxl<i+g[i]) maxl=g[i]+i, p=i;
  }
}
 
void push(int p){
  minx[p*2+1] = min(minx[p*2+1],tip[p]);
  minx[p*2+2] = min(minx[p*2+2],tip[p]);
  tip[p*2+1] = min(tip[p*2+1],tip[p]);
  tip[p*2+2] = min(tip[p*2+2],tip[p]);
  tip[p] = N+1;
}
 
void add(int p,int l,int r,int L,int R,int X){
  if (r<L || R<l) return;
  if (L<=l &&  R>=r){
    minx[p] = min(minx[p],X);
    tip[p] = min(tip[p],X);
    return;
  }
  if (tip[p]<=N) push(p);
  int mid=(l+r)>>1;
  add(p*2+1,l,mid,L,R,X);
  add(p*2+2,mid+1,r,L,R,X);
  minx[p] = min(minx[p*2+1],minx[p*2+2]);
}
 
int get(int p,int l,int r,int L,int R){
  if (r<L || R<l) return N+1;
  if (L<=l &&  R>=r) return minx[p];
  if (tip[p]<=N) push(p);
  int mid = (l+r)>>1;
  int ret1 = get(p*2+1,l,mid,L,R);
  int ret2 = get(p*2+2,mid+1,r,L,R);
  return min(ret1,ret2);
}
 
void work(){
  memset(minx,10,sizeof(minx));
  memset(tip,10,sizeof(tip));
  //add(0,1,N,1,1,1);
  for (i=2;i<N;i++){
    t=get(0,1,N,i-g[i],i-1);
    ans = max(ans, i-t);
    add(0,1,N,i,i+g[i],i);
  }
  printf("%d\n",ans);
}
 
int main(){
  //freopen("2565.in","r",stdin);
  //freopen("2565.out","w",stdout);
  scanf("%s",S+1);
  n=strlen(S+1);
  for (i=n*2+1;i>0;i--)
  if (i&1) S[i]='#'; else S[i]=S[i/2];
  S[0]='*'; S[N=n*2+2]='^';
  Manacher();
//  for (i=1;i<=N;i++)
//    printf("%d %d\n",i,g[i]);
  work();
  return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值