題目鏈結
很容易想到p和q"r相似"就等價於在字尾陣列中q與p之間的height值\(\ge r\),也就是說\(的那些height值會把排好序後的字尾分割成若干段,可以想到倒序列舉r,每當r減小1時,中間把他們分開的那些"屏障"就會減少一些,兩邊的集合會合併到一起,現在的問題就是給定乙個集合,支援合併操作,每次詢問元素乘積最大值(方案數顯然是\(c_^2\))。由於有負值,只需記正值中最大的兩個與負值中最小的兩個即可。
#include#include#include#include#include#include#include#include#include#define p puts("lala")
#define cp cerr<<"lala"<'9')
while(ch<='9'&&ch>='0') re=(re<<1)+(re<<3)+(ch^48),ch=getchar();
return re*g;
}typedef long long ll;
typedef pairpii;
const int n=300050;
char s[n];
int n,rank[n],tt2[n],sa[n],cnt[n],hei[n];
void buildsa()
for(i=1;i<=n;++i) rank[sa[i]]=i;
}void buildheight()
}struct dsynh
inline ll query()
inline void push(ll x)
}t[n];
vectorve[n];
int fa[n],siz[n];
inline int find(int x)
ll ans1=0;
ll merge(int x,int y)
int val[n];
ll out1[n],out2[n];
int main()
for(i=0;ireturn 0;
}
UOJ 131 NOI2015 品酒大會
題鏈 題解 網上大多數的方法都是用並查集維護。這裡呢,給出另一種自己yy的解法 但實際上本質差不多吧 字尾陣列,rmq,單調棧 1 預處理 1 首先對字串字尾排序,得到 sa i rank i height i 2 然後維護出 l i 表示在字尾陣列中,排名最小 記其排名為 l i 的字尾與排名為 ...
UOJ 131 NOI 2015 品酒大會
求出字尾陣列和height陣列後,從大到小掃相似度進行合併,每次相當於合併兩個緊挨著的區間。合併區間可以用並查集來實現,每個區間的資訊都記錄在這個區間的並查集的根上,合併並查集時用乙個根的資訊更新另乙個根的資訊同時計算兩個答案。時間複雜度 o n log n include include incl...
UOJ131 NOI2015 品酒大會
考前掙扎 bu shi 之前留下來的坑 首先注意到sam的parent樹 是反串的字尾樹 也就是原串的字首樹 這個性質很重要 所以說我們在樹上統計的時候兩個點的lca就是兩個字尾串的lcp 於是可以替代字尾陣列 嘿嘿嘿 然後嘞我們樹形dp 統計的size就是以這個串為字首的子串個數 然後我們通過差分...