字符串,数组
1.题意:
找出原串中出现超过2次的子串的数目,每个子串出现多次时不可重叠。
分析:
枚举子串的长度len,找到满足连续的height[i]>=len的最左端 l 和最右端的位置 r,如果r-l>=len说明子串没有重叠。
#include
#include
#include
using namespace std;
const int maxn = 1005;
int N;
char s[maxn];
int sa[maxn],t[maxn],t2[maxn],c[maxn];
void suffix_sa(int n, int m)
{
int i, *x=t, *y=t2;
for (i=0; i
for (i=0; i
for (i=0; i
for (i=n-1; i>=0; i--) sa[--c[x[i]]] = i;
for (int k=1; k<=n; k<<=1) {
int p = 0;
for (i=n-k; i
for (i=0; i= k) y[p++] = sa[i]-k;
for (i=0; i
for (i=0; i