洛谷 P6114 模板 Lyndon分解(模板)

2021-10-08 19:06:03 字數 908 閱讀 1038

詳細的還是去看洛谷大佬的教程吧,我就簡單的概括一下:

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...