馬拉車入門參考部落格及例題匯集

2021-10-04 19:34:57 字數 1814 閱讀 2064

參考部落格

知乎模板

回文串的半徑各種情況的證明+例題

例題

最長回文(模板題)

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

const

int mn=

1e6+5;

char str[mn]

,tmp[mn*2]

;int len[mn*2]

;//轉化字串

intinit

(char

*st)

tmp[

2*len+1]

='#'

; tmp[

2*len+2]

='$'

; tmp[

2*len+3]

=0;return

2*len+1;

}int

manacher

(char

*st,

int len)

ans=

max(ans,len[i]);

}return ans-1;

}int

main()

return0;

}

奇數、偶數長度回文串

由於題目要找的是長度為m的回文,一開始以為只要有長度大於m的回文即可,實際上要分奇數長度和偶數長度的情況。舉個例子,如果乙個字串有乙個最長長度為8的回文,那麼這個長度為8的回文可以刪去首尾得到長度為6、4、2的回文,而得不到長度為3、5、7的回文,因此要分奇數長度和偶數長度,偶數長度找』#'位的半徑,奇數則找字母位的半徑。

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

const

int mn=

1e6+5;

char str[mn]

,tmp[mn*2]

;int len[mn*2]

;int n,k;

//模板

intinit

(char

*st)

tmp[

2*len+1]

='#'

; tmp[

2*len+2]

='$'

; tmp[

2*len+3]

=0;return

2*len+1;

}void

manacher

(char

*st,

int len)}}

intmain()

}if(sign)

printf

("accept");

else

printf

("reject");

}else}if

(sign)

printf

("accept");

else

printf

("reject");

}return0;

}

馬拉車演算法

思路筆記 上述情況1和情況2又可以歸結為 i 的回文半徑 和 r i的距離 中小的那個就是i的回文半徑。include include includeusing namespace std string manacherstring string str return res int min int...

馬拉車演算法

馬拉車演算法是一種計算最長回文子串的演算法,以其優秀的線性複雜度聞名於世,相較於o n 2 o n 2 o n2 的dpdp dp演算法和會被特殊資料卡到o n 2 o n 2 o n2 的暴力演算法,馬拉車演算法無疑是求解最長回文子串的最優選擇。最長回文子串分為偶數串和奇數串,為了避免這些問題,馬...

馬拉車演算法

manacher char s maxn 1 int n,hw maxn 1 int l maxn 1 r maxn 1 void manacher char a n len 2 2 s n 0 int maxr 0,m 0 for int i 1 i n i manacher 題意在給定的字串中找...