給你乙個字串,求有多少對不相交且相同的子串。
位置不同算多對。
\(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 是一種基於直觀或經驗構造的演算法,在可接受的花費 指計算時間 計算空間等 給出待解決優化問題的每一例項的乙個可行解,該可行解與與最優解的偏離程度一般不可以事先預計。啟發式演算法是一種技術,這種演算法可以在可接受的計算費用內找到最好的解,但不一定...
啟發式演算法與元啟發式演算法
相對與精確演算法提出的。是一種群體智慧型演算法。平衡區域性最優解與全域性最優解。啟發式演算法可以這樣定義 乙個基於直觀或經驗構造的演算法,在可接受的花費 指計算時間和空間 下給出待解決組合優化問題每乙個例項的乙個可行解,該可行解與最優解的偏離程度一般不能被預計。許多啟發式演算法是相當特殊的,依賴於某...