CF 427D 字尾陣列

2021-06-29 09:21:15 字數 1353 閱讀 8821

題意:求兩串字串的公共最短子串,且這個子串只在任意一串中出現一次、

首先明確字尾陣列將所有的字尾(也可以視為第i個點開始的子串)字典序排列,將最近似的子串集合在一起。

lcp求的是附近兩個子串的最長公共字首

如果某乙個子串當且僅當出現兩次,則必須是lcp[i]是區域性最大。該子串最大長度為lcp[i],最短長度為max(lcp[i+1],lcp[i-1])+1;

同理,可以推出僅出現n次的子串(字尾自動機啦。)

const int maxn=50000; //字串總長度

int scnt,k;//,k為被增發的k

int rank[maxn];//第幾位開始的字尾陣列排第幾位

int sa[maxn];//對scnt個字尾陣列排序後,第幾位對應字串的第幾位

//第一位為空字串,即最後一位的『\0』,在這個模板裡,最後一位以『\0』鏈結

int lcp[maxn];//最長公共字首,最終排好序的字尾子串i與子串i+1的最長公共字首的長度

int tmp[maxn];//協助更新

bool cmp_sa(int i,int j)

{ if(rank[i]!=rank[j]) return rank[i]0) h--;

for(;j+hlcp[i-1]&&lcp[i]>lcp[i+1]&&((sa[i]

cf669d 觀察規律

jibancanyang author jibancanyang created time 一 4 25 01 45 31 2016 file name cf669d.cpp problem 觀察規律 get 有規律奇數偶數總是相互間隔,且奇數同奇數相對位置不變,偶數同偶數相對位置不變。說以還是要多...

CF915D 解題報告

此題目洛谷評分錯誤,根本沒有紫題難度。最開始的想法 列舉刪除的每一條邊,做一遍拓撲排序,最後直接暴力得出答案。但是,仔細分析時間複雜度 o m n m 根本過不去,所以想優化。我們可以發現,當有 x 條邊是指向 u 時,我們在上面的演算法流程中就會把每一條邊都列舉一次,列舉 x 次。但仔細想想,對於...

CF70D(動態凸包)

給出q 1e5 個詢問,每次在加上乙個點,維護凸包,或者詢問某個點是否在凸包內 在邊上也算 聽說可以用cdq做 但是並不會。我等蒟蒻只會用平衡樹做。首先,假設已經維護出了某個點按照極角排序的凸包,那麼對於加入的乙個點,我們首先要查詢它是在凸包內還是凸包外 這個功能也可以用於題目中的查詢 o表示極角排...