一開始看錯題了。。
然後這題呢,不小心又弄了四個方法,然而我的方法還是最挫的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...