LOJ 6041 事情的相似度

2022-05-11 01:42:03 字數 1100 閱讀 2468

考慮暴力做法,離線詢問

因為兩個串的最長公共字尾,就是所代表節點的 \(lca\) 的 \(len\)

每一次加入乙個字首,在 \(parent\) 樹上往上跳,如果乙個點被跳過我們就更新答案

因為右端點固定時,左端點越大,對詢問的貢獻肯定越多,所以直接覆蓋掉這個節點事件的下標(也就是 \(pos\)),所以我們維護這個節點子樹內的最大 \(pos\) 值就行了

但是還有乙個左端點限制,我們開乙個左端點為下標的樹狀陣列維護一下就好了

實際上這個過程就是 \(lct\) 的 \(access\),那麼用 \(lct\) 做這個過程複雜度就可以均攤為 \(access\) 的複雜度了

#includeusing namespace std;

const int n=2e5+10;

templatevoid gi(t &x)

int fa[n],ch[n][2],len[n],cur=1,cnt=1,n,q,pos[n];

char s[n];int tr[n],ans[n];

struct data;

vectorv[n];vector::iterator it;

inline void add(int x,int y)

inline int qry(int x)

namespace lct

inline bool isrt(int x)

inline void rotate(int x)

inline void pushdown(int x)

inline void push(int x)

inline void splay(int x)

} inline void access(int x,int id)

}inline void ins(int c) }}

int main());

for(int i=2;i<=cnt;i++)lct::fa[i]=fa[i];

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

for(int i=1;i<=q;i++)printf("%d\n",ans[i]);

return 0;

}

LOJ 6041 事情的相似度(字尾自動機)

loj mbox 搬了這道題目。mbox 還是用到 lcp 就是 parent 樹上的 lca 的 len 每次詢問顯然就是區間內點的貢獻。那麼考慮所有可能出現的點對。顯然對於兩個子串而言,只會匹配最靠近的兩個。那麼用 set 維護 endpos 集合,每次合併的時候將兩個最靠近的位置合併成為乙個點...

事情的相似度(SAM LCT 樹狀陣列)

蒟蒻的第一道字串大題 此題的題意是求編號為一段區間的字首的最長公共字尾的長度 而這個最長公共字尾是可以超過這個區間限制的 被坑了好久。那麼這題就比較有思路了 我們可以考慮一下暴力 首先,我們對於每乙個字首 1,i 算出所有的字首 1,1 i 1 與它的最長公共字尾的大小,存到乙個vector裡面 查...

雅禮集訓2017Day7事情的相似度

bitset幫助離線合併實現o n w 然後暴力就可以在n 100000時為所欲為 其實還是有點思想,從大到小列舉height值,這樣每次涉及到的問題的答案一定是height 另外脫機會mle?那就分兩次離唄。沒有什麼是一次離線解決不了的,如果有,那就兩次。從height大到小更新可以簡化轉移,因為...