BZOJ1717 產奶的模式(字尾陣列)

2022-03-20 08:02:20 字數 1105 閱讀 6083

許可權題

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大佬 超神火星人 的部落格 列舉最後最...