bzoj3439 kpm的mc密碼 題解

2022-07-13 20:48:31 字數 959 閱讀 4956

題目大意:

有n個字串,編號為1~n,求每乙個字串在其他字串中以它為字尾的字串中編號第k小的字串的編號。

思路:

將字串倒過來建trie,記錄每個結尾節點的編號(可能會有重複,所以開乙個vector記錄)。再對trie樹進行dfs序,記錄結尾節點的子樹區間。區間第k小,自然用可持久化線段樹(由於權值就是id,所以不用離散化)。 注意:dfs序在遇到結尾節點時才++記錄序號的變數cnt,而且相同串的dfs序號是一樣的(就是說乙個結尾節點可能包含好多個不同編號的串),左區間取最前的乙個(比如dfs到x節點,編號為2,x節點存著兩個串,那麼它們的左區間都為2,而序號要加兩次)

參考自:

**:

1 #include2 #include3 #include4 #include5

#define m 500009

6using

namespace

std;

7 vector q[m];

8int cnt,trie[m][26],num[m],com[m],out[m],dat[m],sum[m<<2],lc[m<<2],rc[m<<2];9

char

s[m];

1011

void ins(int id,char *str)

1218

19void dfs(int

x)20

2728

void build(int l,int r,int cur,int _cur,int

x)29

3536

int ask(int l,int r,int l,int r,int

k)37

4344

intmain()

4555

return0;

56 }

bzoj3439 Kpm的MC密碼(四種做法)

一開始看錯題了。然後這題呢,不小心又弄了四個方法,然而我的方法還是最挫的qaq 挑你們自己喜歡的吧 你就建乙個可持久化tri,然後你就二分一下答案,在1 i這顆字典樹上走到這個字串對應的節點。然後看一下出現過多少次就好了,挺簡單的 include include include include us...

BZOJ3439 KPM的MC密碼 字串雜湊

題目大意 有n個字串s1 sn,n個數k1 kn,求以si字串為字尾的所有字串中第ki個字串的編號。看樣例解釋就很容易理解了,不做贅述。學習了大佬的字串雜湊解法。原位址。想法是把每乙個字尾雜湊,然後記錄每個字尾的字串編號。然後把每個字尾編個號,儲存一下每個編號的雜湊值,用鍊錶儲存和查詢。includ...

BZOJ3438 小M的作物

bzoj3438 小m的作物 小m在mc裡開闢了兩塊巨大的耕地a和b 你可以認為容量是無窮 現在,小p有n中作物的種子,每種作物的種子有1個 就是可以種一棵作物 用1.n編號 現在,第i種作物種植在a中種植可以獲得ai的收益,在b中種植可以獲得bi的收益,而且,現在還有這麼一種神奇的現象,就是某些作...