LOJ6198 謝特(sam 字典樹合併)

2021-09-26 15:56:50 字數 1598 閱讀 7721

題目:

學習了學習了。

在sam上跑乙個合併,將兒子節點的可用數字合併到parent樹父親節點,在01字典樹上找異或最大值,再加上當前父親節點表示的長度(lcp)來更新答案。

很簡單明瞭的乙個思路,但是有乙個疑問,題目要求的是最長公共字首,眾所周知倒著建sam後樹上兩個節點的lcp就是其lca,那麼這麼一路向上合併,有很多時候我們走到的不是lca了,這種時候彷彿有不符合題意的嫌疑。

但是實際上,如果生成異或最大值的兩個字尾在同一顆子樹裡,他們生成的答案在其lca位置是最大的,在之後的非lca位置生成的答案只會更小(parent樹上表示的長度單調),不會影響到答案,而如果來自不同子樹,當前的節點就是lca了。

#include

using namespace std;

const

int maxn =

1e5+5;

int n, w[maxn]

;char s[maxn]

;struct trie

p = next[p]

[c];}}

intfind

(int p,

int x)

else

}return ans;

}int

merge

(int x,

int y)

next[x][0

]=merge

(next[x][0

], next[y][0

]); next[x][1

]=merge

(next[x][1

], next[y][1

]);return x;

}} trie;

struct sam

void

add(

int c)

if(p ==0)

else

else}}

}void

build()

for(

int i =

1; i <= sz; i++

)for

(int i =

1; i <= step[last]

; i++

)for

(int i =

1; i <= sz; i++

)int ans =0;

for(

int i = sz; i > root;

--i)

int maxw =0;

for(

auto j : v[e]

) trie.root[link[e]

]= trie.

merge

(trie.root[link[e]

], trie.root[e]);

ans =

max(ans, step[link[e]

]+ maxw);}

printf

("%d\n"

, ans);}

} sam;

intmain()

sam.

build()

;return0;

}

6 19學習筆記

一.什麼是css3?css3是css技術的公升級版本,css即層疊樣式表 cascading stylesheet 在網頁製作時採用層疊樣式 表技術,可以有效地對頁面的布局 字型 顏色 背景和其 它效果實現更加精確的控制。只要對相應的 做 些簡 單的修改,就可以改變同一頁面的不同部分,或者頁數不同 ...

d619 奇摩知識

內容 不爽寫程式的小光,轉換地方,開始為奇摩知識 奉獻,突然與腿肌同學,發現了某個人所提出來的問題,並展開激烈的討論,最後終於.不過此問題,是某個測試系統的題目.有意義的消音,多半是髒話.題目描述 大家都知道二進位制是由0和1兩種數字組成的,十進位制轉二進位制,小明現在要玩乙個遊戲,就是由1數到n,...

COGS 619 傳話 解題報告

janis 問題描述 興趣小組的同學來自各個學校,為了增加友誼,晚會上又進行了乙個傳話遊戲,如果 a 認識 b 那麼 a 收到某個訊息,就會把這個訊息傳給 b 以及所有 a 認識的人。如果 a 認識 b b 不一定認識 a 所有人從 1 到 n 編號,給出所有 認識 關係,問如果 i 發布一條新訊息...