SPOJ 220 字尾陣列

2021-08-08 03:12:35 字數 1214 閱讀 2575

簡略題意:每個字串中至少出現兩次,且不重疊的最長子串先將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...