簡單而有通俗的講解,講的太好了
證明對於一些我的理解,我會以**注釋的形式寫在**裡, 我不懶
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棵,問第一位同學植了多少棵?分析 設第一位...