LUOGU WD與數列 sam 啟發式合併

2022-03-25 17:28:03 字數 2332 閱讀 8764

給你乙個字串,求有多少對不相交且相同的子串。

位置不同算多對。

\(n\leq 300000\)

先把字尾樹建出來。

dfs 整棵樹,維護當前子樹的 right 集合。

合併兩個集合的時候暴力列舉小的那個集合,然後在另乙個集合的線段樹中查詢相應的資訊計算貢獻。

怎麼計算呢?

如果兩個位置之差 \(>\) 這兩個位置的 \(lcp\)(即當前點的深度),那麼貢獻就是 \(lcp\),否則是位置之差。

線段樹記錄區間點數和位置之和即可。

時間複雜度:\(o(n\log^2n)\),好像能做到 \(o(n\log n)\)。

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

using std::min;

using std::max;

using std::swap;

using std::sort;

using std::reverse;

using std::random_shuffle;

using std::lower_bound;

using std::upper_bound;

using std::unique;

using std::vector;

typedef long long ll;

typedef unsigned long long ull;

typedef double db;

typedef std::pairpii;

typedef std::pairpll;

void open(const char *s)

void open2(const char *s)

int rd()dowhile((c=getchar())>='0'&&c<='9');return b?-s:s;}

void put(int x)static int c[20];int t=0;while(x)while(t)putchar(c[t--]+'0');}

int upmin(int &a,int b)return 0;}

const int n=300010;

int n;

int a[n];

int d[n];

ll ans;

int min(int a,int b)

namespace seg

int insert(int p,int x,int l,int r)

if(x<=mid)

lc[p]=insert(lc[p],x,l,mid);

else

rc[p]=insert(rc[p],x,mid+1,r);

mt(p);

return p;

} int query1(int p,int l,int r,int l,int r)

ll query2(int p,int l,int r,int l,int r)

int merge(int p1,int p2,int l,int r)

lc[p1]=merge(lc[p1],lc[p2],l,mid);

rc[p1]=merge(rc[p1],rc[p2],mid+1,r);

mt(p1);

return p1;

}}namespace sam

}last=np;

} vectorg[2*n],*e[2*n];

int sz[2*n];

int rt[2*n];

void merge(int x,int y,int l)

if(v+1<=n)

// if(v+l+1<=n)

// ans+=(ll)l*seg::query1(rt[y],v+l+1,n,1,n);

ans+=(ll)l*(sz[y]-s1);

}e[x]=e[y];

} else

if(v+1<=n)

// if(v+l+1<=n)

// ans+=(ll)l*seg::query1(rt[x],v+l+1,n,1,n);

ans+=(ll)l*(sz[x]-s1);

}} sz[x]+=sz[y];

rt[x]=seg::merge(rt[x],rt[y],1,n);

} void dfs(int x)

for(auto v:g[x])

}void solve() }

int main()

發現與啟發設計

設計服務於生活,再好的設計,終歸是為生活服務的。如果乙個設計,對於生活毫無意義,那這個設計也就沒有存在的意義了。生活中,無處不在的設計,給我們的生活帶來了美好的體驗,乙個好的設計可以改變我們的生活品質。比如汽車設計,飛機設計,高鐵設計等等,給我們的生活帶來了莫大的方便和舒適。還有室內設計,建築設計,...

啟發式與元啟發式演算法

啟發式演算法 heuristic algorigthm 是一種基於直觀或經驗構造的演算法,在可接受的花費 指計算時間 計算空間等 給出待解決優化問題的每一例項的乙個可行解,該可行解與與最優解的偏離程度一般不可以事先預計。啟發式演算法是一種技術,這種演算法可以在可接受的計算費用內找到最好的解,但不一定...

啟發式演算法與元啟發式演算法

相對與精確演算法提出的。是一種群體智慧型演算法。平衡區域性最優解與全域性最優解。啟發式演算法可以這樣定義 乙個基於直觀或經驗構造的演算法,在可接受的花費 指計算時間和空間 下給出待解決組合優化問題每乙個例項的乙個可行解,該可行解與最優解的偏離程度一般不能被預計。許多啟發式演算法是相當特殊的,依賴於某...