題意:
求重複次數最多的連續重複子串的長度
題解:一樣的思路,列舉重複長度為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個結點。樹的高度不超...