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

2022-03-19 23:10:16 字數 1254 閱讀 8002

loj

\(\mbox\)搬了這道題目。。。\(\mbox\)

還是用到\(lcp\)就是\(parent\)樹上的\(lca\)的\(len\)。

每次詢問顯然就是區間內點的貢獻。

那麼考慮所有可能出現的點對。

顯然對於兩個子串而言,只會匹配最靠近的兩個。

那麼用\(set\)維護\(endpos\)集合,每次合併的時候將兩個最靠近的位置合併成為乙個點對,其貢獻就是當前點的\(len\)。

那麼最終詢問掃瞄線解決即可。

\(zsy\)還有一種用\(lct\)的做法,大致口胡一下就是類似上面的操作,要求的就是乙個鏈並。每次將當前點到根節點的路徑染色,那麼每次的交點就是乙個\(lca\)。發現染色操作類似\(lct\)的\(access\),因此直接這麼模擬即可。

**是第一種做法的。

#include#include#include#include#include#include#includeusing namespace std;

#define ll long long

#define max 100100

inline int read()

int n,m;

char ch[max];

struct nodet[max<<1];

int last,tot,sum;

sets[max<<1];

void extend(int id,int c)

} s[np].insert(id);

}struct pointp[max<<5];

bool operator<(point a,point b);

if(nxt!=s[u].end())p[++sum]=(point);

s[u].erase(*it);

} for(it=s[v].begin();it!=s[v].end();++it)s[u].insert(*it); }}

struct qryq[max];

bool operator<(qry a,qry b)

int ans[max];

int c[max];

int lb(int x)

void add(int x,int w)

int query(int x)

int main()

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

return 0;

}

LOJ 6041 事情的相似度

考慮暴力做法,離線詢問 因為兩個串的最長公共字尾,就是所代表節點的 lca 的 len 每一次加入乙個字首,在 parent 樹上往上跳,如果乙個點被跳過我們就更新答案 因為右端點固定時,左端點越大,對詢問的貢獻肯定越多,所以直接覆蓋掉這個節點事件的下標 也就是 pos 所以我們維護這個節點子樹內的...

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

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

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

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