LOJ 129 模板 Lyndon 分解

2021-10-05 14:16:25 字數 1702 閱讀 2887

傳送門

由於ll

l串是不增的

可以發現一定連續一段l

ll串相同

於是考慮先分割成單減的,然後每一部分按迴圈節分割

考慮假設已經求出了1...i−

11...i-1

1...i−

1的lynd

on

lyndon

lyndon

分解且恰好分解完

考慮從i

ii開始,設j,k

j,kj,

k兩指標,初始j=i

,k=i

+1

j=i,k=i+1

j=i,k=

i+1k

kk指向迴圈節ttt

t′

tttt'

tttt

′的結尾,j=k

−∣t∣

j=k-|t|

j=k−∣t

∣若s[j]

=s[k

],j+

+,k+

+s[j]=s[k],j++,k++

s[j]=s

[k],

j++,

k++即可

若s [j

]>s[

k]

s[j]>s[k]

s[j]

>s[

k],那麼k

kk之後單獨一定更優,而前面是k−j

k-jk−

j長度的迴圈節

若s [j

]

k],j

=i,k

++

s[j]s[

j]k],j

=i,k

++重新形成了迴圈節

複雜度o(n

)o(n)

o(n)

#include

using

namespace std;

#define cs const

#define re register

#define pb push_back

#define pii pair

#define ll long long

#define y1 shinkle

#define fi first

#define se second

#define bg begin

cs int rlen=

1<<20|

1;inline

chargc(

)inline

intread()

inline ll readll()

inline

intreadstring

(char

*s)template

<

typename tp>

inline

void

chemx

(tp &a,tp b)

template

<

typename tp>

inline

void

chemn

(tp &a,tp b)

cs int n=(1

<<20)

|1;char s[n]

;int n;

intmain()

while

(i<=j)

}}

並查集 模板 LOJ109

樣板題幾乎沒必要分析,值得注意的是這道題需要先構建乙個01序列,再進行取模再輸出結果。這裡01序列的構建方法,可以用位運算簡單實現,事實上位運算左移一位等於原值乘以2,但是對這道題來講,寫左移顯然比乘以2更好理解,也有更高的效率。詳見 include include include include ...

無源匯可行流 模板LOJ 115

自個設個源點s,匯點t,每個點 du i 入度 出度。du i 0時 加邊s i,邊權為du i du i 0時 加邊i t,邊權為 du i 設sum為所有 0的du i 的和 求s t的最大流,如果maxflow sum,則存在可行流,此時每條邊流掉的流量 它原本的下界就是實際的流量 dfs過程...

無源匯有上下界可行流 loj模板

loj模板題 思想是 如果存 在可行流 每條邊 必定至少 有下界的 流量 思想是,如果存在可行流,每條邊必定至少有下界的流量 思想是,如果 存在可行 流,每條 邊必定至 少有下界 的流量 那 麼直 接用下屆 填充邊的 流量 那麼直接用下屆填充邊的流量 那麼直接用下 屆填充邊 的流量 每 條邊 的流量...