POJ 3693 字尾陣列

2022-08-31 03:57:08 字數 2314 閱讀 1813

題意:首先定義了乙個字串的重複度。即乙個字串由乙個子串重複k次構成。那麼最大的k即是該字串的重複度。現在給定乙個長度為n的字串,求最大重複次數的子串,有多解時輸出字典序最小解。

思路:與spoj的題意差不多,可以點選這裡看<

說下字典序的問題,想記錄size=最大重複次數,把所有滿足條件的長度l都記錄起來,因為求的是字典序最小,那麼就可以按照sa陣列記錄的字尾位置來判斷,如果index=sa[i]和index+l的lcp>=(size-1)*l,那麼index開始長度為(size*l)的子串就是所要的答案,因為是sa陣列的順序來求的,所以第乙個解肯定是最優解。

#define _crt_secure_no_deprecate#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long

intll;

const

int maxn = 100000 + 5

;int cmp(int *r, int a, int b, int

l)int

wa[maxn], wb[maxn], wv[maxn], ws[maxn];

void da(int *r, int *sa, int n, int

m)

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

for (i = 1; i < m; i++)

for (i = n - 1; i >= 0; i--)

for (j = 1, p = 1; p2, m =p)

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

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

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

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

for (i = 1; i < m; i++)

for (i = n - 1; i >= 0; i--)

for (t = x, x = y, y = t, p = 1, x[sa[0]] = 0, i = 1; i < n; i++)

}return;}

intrank[maxn], height[maxn],sa[maxn];

void calheight(int *r, int *sa, int

n)

for (i = 0; i < n; height[rank[i++]] =k)

return;}

int rmq[maxn],mm[maxn],best[20

][maxn];

void initrmq(int

n)

return;}

int askrmq(int a, int

b)int lcp(int a, int

b)

return(height[askrmq(a + 1

, b)]);

}int r[maxn], ca=1, len; char

str[maxn];

void

solve()

if (tmp > anssize)

if (tmp == anssize)}}

tmpl.erase(unique(tmpl.begin(), tmpl.end()),tmpl.end());

//去重

int index;//

記錄答案的起點

for (int i = 1,flag=0;i <= len&&!flag; i++)}}

printf(

"case %d: %s\n

", ca++, str +index);

}int

main()

r[len] = 0

; da(r, sa, len+1, 30

); calheight(r, sa, len);

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

initrmq(len);

solve();

}//#ifdef local_time

//cout << "[finished in " << clock() - start << " ms]" << endl;

//#endif

return0;

}

字尾陣列 poj 3693

題目 給出乙個串,求重複次數最多的連續重複子串 列舉長度為l,然後看長度為l的字串最多連續出現幾次。既然長度為l的串重複出現,那麼str 0 str l str 2 l 中肯定有兩個連續的出現在字串中。那麼就列舉連續的兩個,然後從這兩個字元前後匹配,看最多能匹配多遠。即以str i l str i ...

poj3693 字尾陣列

題意 給出一串字元,需要求這串字元中的最長重複子串,要是有多個,輸出字典序最小的.我自己的一些想法 這個思路我一開始倒是沒有看明白,慢慢的編下去,才懂了它到底是如何操作的.其實就是列舉多少個字元會匹配,然後求出它們的height值,再用這個值去除以長度,得到有多少個迴圈.具體看 include in...

poj 3693 字尾陣列 RMQ

這道題是字尾陣列的乙個典型應用。求乙個串中連續重複次數最多的乙個子串。做這道題的時候要把握住,連續重複 和 次數最多這兩個關鍵,才能有突破。下面的思路是照搬大牛的 大神不要打我 在字尾陣列神文中有這題的題解。比較容易理解的部分就是列舉長度為l,然後看長度為l的字串最多連續出現幾次。既然長度為l的串重...