Manacher

时间:2023-03-09 03:09:46
Manacher

HDU 3068 Manacher裸题

 #include <cstdio>
#include <cstring>
const int Maxn=;
char Str[Maxn<<],STR[Maxn<<];
int Len,x,P[Maxn<<],Id,Mx;
inline int Max(int x,int y) {return x>y?x:y;}
inline int Min(int x,int y) {return x>y?y:x;}
inline Init()
{
Len=strlen(Str+);
for (int i=;i<=Len;i++) STR[i]=Str[i];
Str[]='$'; Str[]='#';
for (int i=;i<=Len;i++) Str[i<<]=STR[i],Str[i<<|]='#';
Len=Len<<|; Id=;Mx=;
}
inline int Manacher()
{
for (int i=;i<=Len;i++)
{
if (Mx>i) P[i]=Min(P[*Id-i],Mx-i); else P[i]=;
while (Str[i+P[i]]==Str[i-P[i]]) P[i]++;
if (i+P[i]>Mx) Mx=P[i]+i,Id=i;
}
int Ret=;
for (int i=;i<=Len;i++) Ret=Max(Ret,P[i]);
return Ret-;
}
int main()
{
while (scanf("%s",Str+)!=EOF)
{
Init();
printf("%d\n",Manacher());
}
return ;
}

C++

BZOJ 3790 线段求交

用Manacher把最大的回文半径求出然后线段求交即可

 #include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <vector>
#define mp make_pair
#define pb push_back
#define PA pair<int,int>
#define fi first
#define se second
using namespace std;
const int Maxn=;
const int Inf=0x3f3f3f3f;
char S[Maxn],Str[Maxn];
int P[Maxn],c[Maxn];
int Len;
vector<PA> Line;
inline int Min(int x,int y) {return x>y?y:x;}
inline int lowbit(int x) {return x&-x;}
inline int Query(int x)
{
if (x==) return ;
int Ret=Inf;
for (int i=x;i<=Len;i+=lowbit(i)) Ret=Min(Ret,c[i]);
return Ret;
}
inline void Update(int x,int y)
{
for (int i=x;i;i-=lowbit(i)) c[i]=Min(c[i],y);
}
inline void Manacher()
{
int m=Len<<|;
for (int i=;i<=Len;i++)
{
S[i<<]=Str[i];
S[i<<|]='#';
}
S[]='#'; S[]='&'; S[m+]='^';
int Mx=,Id=;
for (int i=;i<=m;i++)
{
if (i<Mx) P[i]=Min(Mx-i,P[*Id-i]); else P[i]=;
while (S[i-P[i]]==S[i+P[i]]) P[i]++;
if (i+P[i]>Mx) Mx=i+P[i],Id=i;
int l=(i-P[i])/+,r=(i+P[i])/-;
if (l<=r) Line.pb(mp(r,l));
}
}
int main()
{
while (scanf("%s",Str+)!=EOF)
{
Len=strlen(Str+); Line.clear();
Manacher();
sort(Line.begin(),Line.end());
for (int i=;i<=Len;i++) c[i]=Inf;
int Ans=Inf;
for (int i=;i<Line.size();i++)
{
int x=Query(Line[i].se-)+;
Update(Line[i].fi,x);
if (Line[i].fi==Len) Ans=Min(Ans,x);
}
printf("%d\n",Ans-);
}
return ;
}

C++