最長回文字串 馬拉車演算法

2021-07-15 21:16:40 字數 2232 閱讀 2457

很簡單的例題,就比如hdu3068那個,模版題。

首先我們可以考慮暴力,然後可以列舉中心,當你列舉中心的時候,先是1,再是2,如果2不行,那就可以退出了,因為以該點為中心的字串不能繼續拓展了。我們應該開始列舉下乙個中心點了。

然後我們考慮優化,馬拉車演算法的核心就是利用了前面計算的資訊,從而高效的得出最長回文字串,考慮奇偶性的時候,我們插入『#』使得統一。

/**************************

*create time: fri jul 29 21:15:44 2016

*author: mymilkbottles

*file name: hihocoder1032

**************************/

#include

using

namespace

std;

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define pi(x,y) printf("%d%c",(x),(y));

#define pin(x) printf("%d\n",(x));

#define si(x) scanf("%d",&(x))

#define sii(x,y) scanf("%d%d",&(x),&(y))

#define s3(x,y,z) scanf("%d%d%d",&(x),&(y),&(z))

#define rep(x,y,z) for(int (x)=(y);(x)<(z);++(x))

#define dep(x,y,z) for(int (x)=(y)-1;(x)>=(z);--(x))

#define read int tcasen;scanf("%d",&tcasen);for(int tcase=1;tcase<=tcasen;++tcase)

#define cls(x,y) memset((x),(y),sizeof((x)));

#define pb(x) push_back(x)

#define mp(x,y) make_pair((x),(y))

#define max3(value_a,value_b,value_c) max(max(value_a,value_b),value_c)

#define min3(value_a,value_b,value_c) min(min(value_a,value_b),value_c)

#define gt(x) (x)=clock();

///in this you can define long integer type

#define longtype long long

typedef longtype ll;

typedef

unsigned longtype ull;

const

int maxint=((~((unsigned)(0)))>>1);

const ll maxll=((~((unsigned longtype)(0)))>>1);

const

int inf=0x3f3f3f3f;

const

double pi=acos(-1.0);

const

int maxn=1e6+1000+5;

char dp[maxn<<1];

char a[maxn];

int p[maxn<<1];

int len;

void mlc() else p[i]=1;

while(dp[i-p[i]]==dp[p[i]+i])++p[i];

// cout<<"i="mx)

ans=max(ans,p[i]-1);

}printf("%d\n",ans);

}int main()

dp[len++]='\0';

mlc();

}#ifdef tangge

gt(tend);

printf("%.8lf\n",(tend-tstart)/1000.0);

#endif // tangge

return

0;}

最長回文字串(馬拉車演算法)

演算法總結第三彈 manacher演算法,前面講了兩個字串相演算法 kmp和拓展kmp,這次來還是來總結乙個字串演算法,manacher演算法,我習慣叫他 馬拉車 演算法。相對於前面介紹的兩個 演算法,manacher 演算法的應用範圍要狹窄得多,但是它的思想和拓展kmp 演算法有很多共通支出,所以...

最長回文串(馬拉車演算法)

最長回文子串 manacher演算法 馬拉車演算法 馬拉車演算法需要計算以每個字元為中心的回文串半徑。並記錄最右邊界 馬拉車演算法基於這樣乙個事實,從回文串的中心到兩邊是對稱的,意味著以兩邊對稱的字元為中心的回文串半徑相等 在不超過最右邊界的情況下,如果超出就需要擴充套件搜尋 public stri...

最長回文串 馬拉車演算法

有兩個長度均為n的字串a和b。可以從a中選乙個可以為空的子串a l1 r1 b中選乙個可以為空的子串b l2 r2 滿足r1 l2,然後把它們拼起來 a l1 r1 b l2 r2 求用這樣的方法能得到的最長回文串的長度。注意 求的不是本質不同的回文串個數哦!解題報告 找兩個之間的最長回文串,只不過...