簡略題意:每個字串中至少出現兩次,且不重疊的最長子串先將n
個字串連線起來,二分答案t,用
t 分組之後看同一組的是否出現在所有串中至少兩次,且在每個原串中的最大最小sa
[i]−
sa[j
]>=
k。其實只要同時存在最大最小位置,即出現了至少兩次。
#include
#include
#include
#include
#include
#include
using
namespace
std;
const
int n = 1e5+1100;
int n, q;
char str[n], str2[n];
int belong[n];
int f = 0;
int minv;
namespace sa
s1[y = x] = ch;
}if (ch+1
< n1) sais(n1, ch+1, s1, t+n, p+n1);
else
for (int i = 0; i < n1; i++) sa[s1[i]] = i;
for (int i = 0; i < n1; i++) s1[i] = p[sa[i]];
inducedsort(s1);
}template
int mapchartoint(int n, const t *str)
template
void suffixarray(int n, const t *str)
}template
void init(t *str)
int mx[12], mi[12];
int vis[12], count = 0;
void checkinit()
bool check(int x) else
}return
0; }
void solve()
printf("%d\n", l - 1);
}};int t;
int main()
n = s;
sa::init(str);
sa::solve();
}return
0;}
spoj 694 705 字尾陣列
每個子串一定是某個字尾的字首,那麼原問題等價於求所有字尾之間的不相同的字首的個數。如果所有的字尾按照 suffix sa 1 suffix sa 2 suffix sa 3 suffix sa n 的順序計算,不難發現,對於每一次新加進來的字尾 suffix sa k 它將產生 n sa k 1 個...
spoj687(字尾陣列)
題意 給一串字元,需要你求這一串字元中有連續重複的字元的重複次數.思路 這是和poj3693一種型別的題目.這裡是詳細解答 注意 還需注意的地方,我一直圖方便,再求lcp值時,總是從height值的起點到終點,其實應該是起點 1 include include includeusing namesp...
字尾陣列入門 SPOJ694
求單個子串的不重複字串的個數 t 20,len 1000 這是一道經典的字尾陣列入門題。由於剛開始學,對字尾陣列的理解還很抽象,於是拿這道題先找找感覺。首先,每個子串都可以理解成是某個字尾的字首,這是聯想到字尾陣列演算法的重要一步。接著,對於每乙個sa i 字尾陣列,含義為第i小的字尾的起始位置是s...