許可權題
hihocoder
洛谷\(hihocoder\)裡面講的非常好了
這題要求的就是最長可重疊重複k次子串
所謂相同的子串
我們可以理解為如果有兩個字尾的字首相同
那麼就有乙個相同的子串
如果兩個字尾的字首相同
那麼他們在\(sa\)中的排名是接近的
再說清楚點
如果兩個字尾的字首相同
必然是在字尾排序中一段連續的字尾都擁有這個相同的字首
因此,求出\(height\)陣列之後
考慮如何計算答案:
直接搞顯然搞不出來
因此二分一下答案
如何\(check\)是否存在長度為\(mid\)的\(k\)重複子串呢?
既然是一段連續的區間
因此,就需要檢查是否有超過\(k\)個連續的\(height\)都\(>=mid\)
這個很容易證明:
如果有\(l..r\)的\(height\)都超過了\(mid\)
那麼,證明這一段區間中任意兩個字尾的
\(lcp\)長度都至少為\(mid\)
所以,此時這個\(mid\)一定出現了超過\(k\)次
所以,大力二分一下即可
#include#include#include#include#include#include#include#include#include#includeusing namespace std;
#define max 1200000
inline int read()
int sa[max],rank[max],x[max],y[max],t[max];
int height[max],a[max];
int n,k;
bool cmp(int i,int j,int k)
void getsa()
for(int i=1;i<=n;++i)rank[sa[i]]=i;
for(int i=1,j=0;i<=n;++i) }
bool check(int h)
printf("%d\n",ans);
return 0;
}
bzoj1717 產奶的模式
給出乙個長度為n的數字序列和乙個k,求最長的出現了至少k次的子串行的長度。經典問題,求出height陣列,二分答案然後判斷是否有一組的字尾個數大於等於k。include include using namespace std const int max n 20005 int n,k,a max n...
1717求素因子
求素因子 time limit 1 seconds memory limit 32768 k total submit 589 accepted 327 description 任一整數x,找出它的素因子並以如下格式輸出 72 2 2 2 3 3 120 2 2 2 3 5 input 任意整數x ...
洛谷 P1717 釣魚
題目 釣魚 題意 剛開始沒讀懂 就是說有一排魚塘 i n 每乙個魚塘初始魚的數量為fi,在這個魚塘中每釣5分鐘魚的數量都會減少di,且從第i個魚塘走到第i 1個魚塘要用ti的時間。問從第乙個魚塘開始走,到任意乙個魚塘結束,最多可以獲得的魚的數量。思路 luogu大佬 超神火星人 的部落格 列舉最後最...