manacher演算法 例題

2021-10-24 18:32:18 字數 2763 閱讀 5366

簡單而有通俗的講解,講的太好了

證明對於一些我的理解,我會以**注釋的形式寫在**裡, 我不懶

char  str[maxn]

;char temp[

(maxn <<1)

+10];

//擴充套件後的字串

int len[

(maxn <<1)

+10];

//擴充套件後字串第i個位置回文串從中間到第有邊界的長度

//相當於 回文子串長度 / 2 + 1

//在用左移運算子的時候要注意 << 比 + 的優先順序要低,要加上括號..

這裡求一下最長子串的位置就可以了

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

const

int maxn =

200000+5

;const

int size =20;

char str[maxn]

;char temp[

(maxn <<1)

+10];

//擴充套件後的字串

int len[

(maxn <<1)

+10];

//擴充套件後字串第i個位置回文串從中間到第有邊界的長度

//相當於 回文子串長度 / 2 + 1

//在用左移運算子的時候要注意 << 比 + 的優先順序要低,要加上括號..

inline

intinit

(int len)

temp[

2* len +1]

='#'

; temp[

2* len +2]

='$'

; temp[

2* len +3]

=0;return

2* len +1;

}int

manacher

(int len,

int&pos)

if(ans < len[i])}

return ans -1;

}int

main()

//最長回文子串在原字串中的左右邊界

//因為每乙個回文子串結尾的左右兩端都是'#'

//那麼我們左右都找ans-1個字元保證這時候

//這個字串左右兩端都是原串字元這樣直接除2就可以得到最長子串的左右端點

int l =

(pos - ans +1)

/2-1

;int r =

(pos + ans -1)

/2-1

;printf

("%d %d\n"

,l,r)

;for

(int i = l; i <= r; i++

)printf

("\n");

}return0;

}

裸題

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

const

int maxn =

110000+5

;const

int size =20;

char str[maxn]

;char temp[maxn<<1+

10];int len[maxn<<1+

10];inline

intinit

(int len)

temp[

2* len +1]

='#'

; temp[

2* len +2]

='$'

; temp[

2* len +3]

=0;return

2* len +1;

}int

manacher

(int len)

ans =

max(ans,len[i]);

}return ans -1;

}int

main()

return0;

}

Dijkstra演算法 例題

dijkstra演算法 從起點到終點求最短路 使用要求權值為正 1 求短路i 題目 點數 500 邊數 1e5 include include include using namespace std const int n 510,m 1e5 10 時間複雜度o n m int n,m 鄰接矩陣 i...

模擬演算法例題

一 火柴棒 題目描述 給你n根火柴棍,你可以拼出多少個形如 a b c 的等式?等式中的a b c是用火柴棍拼出的整數 若該數非零,則最高位不能是0 用火柴棍拼數字0 9的拼法如圖所示 注意 1 加號與等號各自需要兩根火柴棍 2 如果a b,則a b c與b a c視為不同的等式 a b c 0 3...

遞推演算法例題

例1 植樹節那天,有五位同學參加了植樹活動,他們完成植樹的棵樹都不相同,問第一位同學植了多少棵樹時,他指著旁邊的第二位同學說比他多植了兩棵 追問第二位同學他又說比第三位同學多植了兩棵,如此追問,都說比另一位同學多植兩棵。最後問道第五位同學時,他說自己種了10棵,問第一位同學植了多少棵?分析 設第一位...