hdu 6194 字尾陣列

2021-08-08 04:20:38 字數 1062 閱讀 5587

題意:乙個字串,查詢恰好出現k次的子串的數目

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

**:

#includeusing namespace std;

#define x first

#define y second

#define pb push_back

#define mp make_pair

#define mem(a,b) memset(a,b,sizeof(a))

using namespace std;

const int maxn = 5e5+100;

int t1[maxn], t2[maxn], c[maxn],n;

bool cmp(int *r, int a, int b, int l)

void da(int str, int sa, int zrank, int height, int n, int m)

int k = 0;

n--;

for (i = 0; i <= n; i++)zrank[sa[i]] = i;

for (i = 0; i < n; i++)

}int m_rank[maxn], height[maxn];

int rmq[maxn];

int mm[maxn];

int best[30][maxn];

void initrmq(int n)

int main()

initrmq(n);

memset(q, 0, sizeof(q));

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

int ret;

ans=0;

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

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

}return 0;

}

HDU6194 字尾陣列)

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

HDU 6194 字尾陣列 RMQ

好絕望的。想了五個多小時,最後還是沒a。賽後看了下字尾陣列瞬間就有了思路。不過因為太菜,想了將近兩個小時才吧這個題乾掉。首先,應當認為,字尾陣列的定義是,某字串s的所有字尾按照字典序有小到大的順序排列 使用下標表示字尾 因為具體過程沒太看懂,但是參見劉汝佳藍書 演算法競賽黑暗聖典 可以得到乙個聰明的...

HDU6194 字尾陣列的應用

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