SPOJ 687 REPEATS(字尾陣列)

2021-09-29 21:09:13 字數 1106 閱讀 4337

題意:

求重複次數最多的連續重複子串的長度

題解:一樣的思路,列舉重複長度為l,就有rk[

pos]

rk[pos]

rk[pos

]和rk[p

os+l

]rk[pos+l]

rk[pos

+l]這兩個串,pos為列舉的l的倍數,即rk[

k∗l]

rk[k*l]

rk[k∗l

]和rk[(

k+1)

∗l)]

rk[(k+1)*l)]

rk[(k+

1)∗l

)]乙個意思,寫法不同而已,然後我們可以計算他們的lcp,用rmq就可以,然後我們知道如果rk[

k∗l]

rk[k*l]

rk[k∗l

]是第乙個重複子串的首字元那麼是不受影響的,受影響的是後面的,因為我們的這兩個字尾已經匹配了l個字元,那麼還需要l-lcp%l個字元就可以又增加一次重複的數量,所以我們再檢查一下前面l-lcp%l個字元能否完成匹配即可。

ac**:

#include

using

namespace std;

const

int maxn =

5e4+10;

int rk[maxn]

,y[maxn]

,c[maxn]

;int sa[maxn]

,h[maxn]

;int dp[maxn][20

],log[maxn]

;char s[maxn]

;void

pre(

)void

init()

voidsa(

int n,

int m)

}voidh(

int n)

}void

rmq_init

(int n)

intrmq

(int l,

int r)

intmain()

}printf

("%d\n"

,ans);}

}

spoj687(字尾陣列)

題意 給一串字元,需要你求這一串字元中有連續重複的字元的重複次數.思路 這是和poj3693一種型別的題目.這裡是詳細解答 注意 還需注意的地方,我一直圖方便,再求lcp值時,總是從height值的起點到終點,其實應該是起點 1 include include includeusing namesp...

字尾陣列 RMQ SPOJ 687

題意 問給出的串中連續重複的子串的最長的長度 思路 先將字尾陣列和高度陣列先求出來,分別為sa和lcp陣列。然後用rmq的st演算法將從位置i和j開始的字尾的最長公共字首求出來,這個還好理解把,對與排名第一的字尾,它的高度陣列為與排名第二的字尾的最長公共字首,依次類推,比如到第四個,前四個分別為5,...

687 最長同值路徑

給定乙個二叉樹,找到最長的路徑,這個路徑中的每個節點具有相同值。這條路徑可以經過也可以不經過根節點。注意 兩個節點之間的路徑長度由它們之間的邊數表示。示例 1 輸入 5 4 5 1 1 5 輸出 2示例 2 輸入 1 4 5 4 4 5 輸出 2注意 給定的二叉樹不超過10000個結點。樹的高度不超...