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大到小更新可以簡化轉移,因為...