題意:求兩串字串的公共最短子串,且這個子串只在任意一串中出現一次、
首先明確字尾陣列將所有的字尾(也可以視為第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表示極角排...