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

2021-08-08 10:42:10 字數 949 閱讀 7979

一開始看錯題了。。

然後這題呢,不小心又弄了四個方法,然而我的方法還是最挫的qaq

挑你們自己喜歡的吧

你就建乙個可持久化tri,然後你就二分一下答案,在1~i這顆字典樹上走到這個字串對應的節點。。

然後看一下出現過多少次就好了,挺簡單的

#include

#include

#include

#include

using

namespace

std;

const

int n=300005*2;

struct qq

s[n];int num=0;

int l[n],r[n],cnt;

char s1[n];

int n;

char ss[n];

int root[n];//前i個串

void ins (int &rt1,int x,int rt2)

int k;

int check (int now,int x)//前多少個字串 第幾個字串去匹配

return s[now].c;

}int main()

for (int u=1;u<=n;u++)

else l=mid+1;

}printf("%d\n",ans);

}return

0;}

我們可以吧串從小到大插入,可以知道乙個串的kpm串肯定是在他後面的

於是在後面插的時候如果這個節點之前是別人的終點,你就在別人那裡加上自己

最後每個點都可以獲得乙個集合,拍個序就好了

大概就是把2的方法,按時間順序插入,然後我們將他路過的點都加上他自己的資訊。。

然後以後某個串的終點的kmp串就是他的終點節點所擁有的資訊

就是dfs序+主席樹,我也沒有認真看,不寫了

bzoj3439 kpm的mc密碼 題解

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

BZOJ3439 KPM的MC密碼 字串雜湊

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

修改密碼的四種方法

首先登入mysql。格式 mysql set password for 使用者名稱 localhost password 新密碼 例子 mysql set password for root localhost password 123 格式 mysqladmin u使用者名稱 p舊密碼 passw...