詳細的還是去看洛谷大佬的教程吧,我就簡單的概括一下:
lyndon分解可以將乙個字串分為若干個lindon串,並且前乙個lindon串的字典序大於等於後乙個lyndon串的字典序。
用三個指標維護:
i:新的lyndon串的起始位置
k:當前列舉到的位置
j:維護從i開始的字串到k的最短的lyndon迴圈。
1.那麼如果s[k]==s[j]的話,j++,k++維護迴圈長度,例如:(之後預設下標以0開始)
abcabc
k在3的時候,j=0,k在4的時候j=1,k在5的時候j=2
2.s[j]s[k],也就說明後面的迴圈的lyndon串要小於前面的了,於是迴圈結束,以後面的迴圈開始下乙個lyndon分解,例如:
abcabb
k=5時,j=3,發現s[k]比較小,於是**,然後i從3開始,j從3開始,k從4開始重新lyndon分解。
可證lyndon分解的時間複雜度是o(n)的
沒有題解,就注意他的時限卡的很緊,然後的話就存個模板吧,pos表示每個lyndon分解串的結束位置
#include
using
namespace std;
const
int n=
5e6+5;
char s[n]
;vector<
int>pos;
int ans;
void
lyndon
(char
*s)while
(i<=j)}}
intmain()
Dinic模板 洛谷P3376
dinic演算法是網路流最大流的優化演算法之一,每一步對原圖進行分層,然後用dfs求增廣路。時間複雜度是o n 2 m dinic演算法最多被分為n個階段,每個階段包括建層次網路和尋找增廣路兩部分。dinic演算法的思想是分階段地在層次網路中增廣。它與最短增廣路演算法不同之處是 最短增廣路每個階段執...
Tarjan模板 洛谷P2921
傳送門 上 先佔坑,我去打打noip2018 滑稽 好了好了回來了,noip太難了,做不動。tarjan是用來求強連通分量的演算法。應用十分廣泛。tarjan演算法就不證明了,有興趣的可以去網上看大神們的各種證明。主要是我也不會證明啊 隨便講講tarjan怎麼寫的吧。low和dfn是最重要的兩個陣列...
洛谷P3378 模板 堆
洛谷p3378 輸入樣例 51 2152 32輸出樣例 25ac include using namespace std const int maxn 1e6 5 int heap maxn int ind 0 void insertheap 自下向上調整堆,因為除新加的結點外符合小根堆定義 ret...