P2852 字尾陣列 單調佇列

2021-10-03 03:22:36 字數 1098 閱讀 2980

資料範圍:

首先貪心的思考一下,把題意中的「至少」二字去掉。

這個相當於問

那我們掏出字尾陣列的板子,然後求出

然後我們用單調佇列維護一下區間最小值的最大值就好了。

看了之後立刻想到了和題解一樣的解法。

但是說實話我第一反應不是實現它,還是hack我自己。

不自信。

#includeusing namespace std ;

typedef long long ll ;

const int maxn = 1e6 + 5 ;

int rk[maxn << 1] , sa[maxn << 1] , height[maxn << 1] ;

int tmp[maxn << 1] , cnt[maxn] ;

int s[maxn] ;

int q[maxn] ;

void suffixarray(int n , int m)

sa[tmp[cnt[0] = 0]] = j = 0 ;

for(int i = 1 ; i < n ; i ++)

memcpy(rk , sa , n * sizeof(int)) ;

memcpy(sa , tmp , n * sizeof(int)) ;

if(j >= n - 1) break ;

}height[0] = 0 ;

for(int i = 0 , k = 0 , j = rk[0] ; i < n - 1 ; i ++ , k ++)

while(~k && s[i] != s[sa[j - 1] + k])

height[j] = k -- , j = rk[sa[j] + 1] ;

}int main()

suffixarray(n , num) ;

for(int i = 2 ; i <= k ; i ++)

ans = max(ans , height[q[l]]) ;

for(int i = k + 1 ; i <= n ; i ++)

printf("%d\n" , ans) ;

return 0 ;

}

poj 3415 字尾陣列 單調佇列

common substrings time limit 5000ms memory limit 65536k total submissions 8106 accepted 2688 description a substring of a string t is defined as t i,k...

POJ 3415 字尾陣列 單調棧

簡略題意 求兩個串長度不小於k的公共子串的個數。我喜歡這題!首先按height分組,隨後對於每個a字尾,看之前出現的b字尾與其的lcp,若其長度為 x 則對答案的貢獻為x k 1。暴力查詢n2 其實b字尾的排名越接近當前a字尾,兩者的lcp越高 想一想,為什麼,因此維護乙個單調棧,以及棧內元素貢獻總...

P4051 字尾陣列

給你乙個字串,輸出加密後的字串。例如 jsoi07 可以讀作 jsoi07 soi07j oi07js i07jso 07jsoi 7jsoi0 把它們按照字串的大小排序 07jsoi 7jsoi0 i07jso jsoi07 oi07js soi07j 讀出最後一列字元 i0o7sj,就是加密後的...