題意:首先定義了乙個字串的重複度。即乙個字串由乙個子串重複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的串重...