WOJ3750 子串查詢 字尾自動機

2021-09-04 19:32:26 字數 783 閱讀 4524

給定乙個字串 a和1個字串 b ,求 b 和 a 中的最長公共子串。(len(a、b)<=2e5)

只需要對乙個串建乙個sam

samsa

m 然後把另乙個串在上面跑就是了

如果發現當前已匹配好的地方的下乙個字元不一樣,就沿著當前節點的lin

klink

link

一直往上跳,跳到第乙個能匹配的地方跳下去就可以了

因為e nd

po

sendpos

endpos

的性質這顯然是對的

#include

using

namespace std;

inline

intread()

struct node

;#define max(a,b) (((a)>(b))?a:b)

const

int n=

200005

;node st[n<<1]

;int tot,ans,last;

char a[n]

;inline

void

init()

inline

void

sa_extend

(int c)

} last=cur;

}int

main()

ans=

max(ans,tmp);}

cout<}

LuoguP2408 不同子串個數(字尾自動機)

題目傳送門 先建好字尾自動機,然後答案就是 sum len u len link u 為什麼這樣是對的?每個狀態所代表的字串是沒有交集的,所以我們只需求出每個狀態有多少個子串。其實在學習構建sam的時候我們學過link的乙個性質,就是len link x 1 min len x 且乙個狀態內的字串按...

字尾自動機求多個串的公共子串數目

求n個串的本質不同公共子串的數目。我的做法是對第乙個串構造sam,同時得到每個狀態節點在原串的位置。然後對剩下的n 1的個串在第乙個串的sam上跑,可以得到每個狀態節點 的最長匹配長度,這時候就得到了節點數目個區間,將區間合併,對這些 區間形成的串再建乙個廣義字尾自動機,求出本質不同串的數目。時間複...

BZOJ1396 識別子串 字尾自動機 線段樹

time limit 10 sec memory limit 162 mb submit 451 solved 290 submit status discuss 一行,乙個由小寫字母組成的字串s,長度不超過10 5 l行,每行乙個整數,第i行的資料表示關於s的第i個元素的最短識別子串有多長.ago...