HDU 6194 字尾陣列 RMQ

2022-08-13 09:27:12 字數 1329 閱讀 7670

好絕望的。。想了五個多小時,最後還是沒a。。。賽後看了下字尾陣列瞬間就有了思路。。。不過因為太菜,想了將近兩個小時才吧這個題乾掉。

首先,應當認為,字尾陣列的定義是,某字串s的所有字尾按照字典序有小到大的順序排列(使用下標表示字尾)。因為具體過程沒太看懂,但是參見劉汝佳藍書《演算法競賽黑暗聖典》可以得到乙個聰明的nlogn的神器演算法。不過這個不太重要。

之後還可以通過他在lcp問題中提到的rank,height陣列相關演算法,處理出來height陣列,之後其他的可以扔掉。

《黑暗聖典》中定義了height陣列,height[k]的含義是,第rank[i]陣列和rank[i]-1之間的最長公共字首的長度。。。基於這個我們可以看到一些規則。

首先height陣列的定義具有傳遞性,很容易想到的就是。。。出現且僅出現m次可以被簡單的定義為,傳遞且僅能夠被傳遞m次。。。

於是。。。我們有了如下演算法.

#include#include

#include

using

namespace

std;

const

long

long maxn=400233

;const

long

long inf=1e8+7

;char

s[maxn];

//long long dp[maxn];

long

long

sa[maxn],t[maxn],t2[maxn],c[maxn],n,len;

long

long

r1ank[maxn],height[maxn];

long

long d[maxn][30

];void

rmq_init()

long

long rmq(int a,int

b)int

m;void build_sa(int

m)if(p>=n)break

; m=p;

}}void

getheight()

height[n]=0;}

intmain()

int a=i+1;int b=i+m-1

;

long

long limit=rmq(a,b);

if(n>b&&limit>max(height[i],height[b+1]))ans+=limit-max(height[i],height[b+1

]);

}cout

<"\n"

; }

}

hdu 6194 字尾陣列

題意 乙個字串,查詢恰好出現k次的子串的數目 思路 字尾陣列在height上進行操作。我們直接列舉長度為k的區間求min值,但是要注意的是直接這麼算是會重複的,同時也可能超過k次,這樣我們就需要把列舉的前乙個和後乙個都判斷一下,這樣保證了等於k次,同時也保證了沒有重複統計。includeusing ...

HDU6194 字尾陣列)

題意 告訴你乙個字串和k 求這個字串中有多少不同的子串恰好出現了k 次。解題思路 先用字尾陣列進行算出height,然後用st表維護,然後用區間長為k進行查詢,找出最小的height,目的是為了找出k都有的字串長度,然後區間往左右分別擴充套件乙個單位,目的是看看左右的重複情況,左右的最大值,代表超出...

HDU6194 字尾陣列的應用

題目大意 給你乙個串,讓你統計有多少個子串出現了恰好k次,可重複的子串。分析 第一道字尾陣列的題目。我們先求出sa陣列和,height陣列,然後我們不難發現,我們需要列舉區間k,在 i,i k 1 這個區間裡面去求sa i,i k 1 的最長公共字首,這樣就求出來了至少出現k次的子串,然後我們需要去...