BZOJ3439 KPM的MC密碼 字串雜湊

2021-08-18 12:15:30 字數 909 閱讀 7015

題目大意:有n個字串s1~sn,n個數k1~kn,求以si字串為字尾的所有字串中第ki個字串的編號。看樣例解釋就很容易理解了,不做贅述。

學習了大佬的字串雜湊解法。。原位址。。

想法是把每乙個字尾雜湊,然後記錄每個字尾的字串編號。然後把每個字尾編個號,儲存一下每個編號的雜湊值,用鍊錶儲存和查詢。

#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

typedef unsigned long long ull;

const int maxint = ~0u >> 1;

const int maxn = 300010;

const int bas = 233;

const int m = 100007;

vectormp[maxn];

char str[maxn];

int h[m];

int head[m], nxt[m], cnt;

ull val[m];

int insert(ull hs)//插入雜湊值,同時也是獲取該雜湊值的編號

nxt[++cnt] = head[u];

val[cnt] = hs;

head[u] = cnt;

return cnt;

}int main()

h[i] = hs;

} for (int i = 1;i <= n;i++)

return 0;

}

bzoj3439 kpm的mc密碼 題解

題目大意 有n個字串,編號為1 n,求每乙個字串在其他字串中以它為字尾的字串中編號第k小的字串的編號。思路 將字串倒過來建trie,記錄每個結尾節點的編號 可能會有重複,所以開乙個vector記錄 再對trie樹進行dfs序,記錄結尾節點的子樹區間。區間第k小,自然用可持久化線段樹 由於權值就是id...

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

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

字串匹配的KPM演算法

轉至 字串匹配是計算機的基本任務之一。舉例來說,有乙個字串 bbc abcdab abcdabcdabde 我想知道,裡面是否包含另乙個字串 abcdabd 許多演算法可以完成這個任務,knuth morris pratt演算法 簡稱kmp 是最常用的之一。它以三個發明者命名,起頭的那個k就是著名科...