CF149E 字尾自動機

2021-06-18 04:23:42 字數 973 閱讀 4778

題意:給出乙個長字串s和一組詢問字串,對於每個詢問需要知道在s中是否存在兩個位置不同的子串可以組成該詢問字串。

建s的字尾自動機,同時處理出每個狀態出現的最左位置和最右的位置。拿每乙個詢問和s的自動機匹配,記錄下詢問串中以每個位置為結尾所匹配的長度和匹配自動機中哪個狀態。設l為整個詢問串所能匹配的長度,那麼我們檢測這樣的結尾i(len - l =< i < len)是否可以匹配整個字首,同時所匹配的狀態所出現的最左的位置滿足要求。

#include #include #include #include #define lng long long

using namespace std;

const int maxn = 200000 + 10;

int pos[2000], length[2000];

char str[maxn];

struct suffixautomaton

void insert(int x)

if(p == -1) pre[np] = 0;

else}}

}void calc()

for(int i = 0; ; i = ch[i][str[val[i]] - 'a'])

for(int i = sz - 1; i > 0; --i)

}int query(char * s)

else

else u = 0, ll = 0;

}pos[i] = u; length[i] = ll;

}u = pos[len - 1];

if(length[len - 1] == len) return 1;

while(u != 0)

return 0;

}}sam;

int n;

int main()

cout << res << "\n";

return 0;

}

字尾自動機

基礎知識 step i 表示的是字串i在原字串中的位置。pareint i 表示root到parent i 的子串是root到i的最長字尾。字尾自動機遍歷可以得到原字串的所有子串。特殊技巧 一 字尾自動機的不同子串數有兩種求法 1.ans step i step parent i 1 i cnt 2...

字尾自動機

常用於處理字串問題,可以高效解決許多字串問題。有點像將乙個字串的所有字尾都建在乙個ac自動機上,但不同的是字尾自動機的節點數最多為2 n,因為它只記錄需要記錄的點,一些沒有記錄東西的點可以視為與下面有價值的節點並在一起,這樣大大降低了時間複雜度和空間複雜度。對於每乙個節點記錄它的後面加上每個字元後字...

字尾自動機

基礎學習 簡潔明瞭的講解 總狀態數不超過2n 12n 1 2n 1 包括初始狀態 統計每個end po sendpos endpos 等價類出現位置數量時,要按長度從長到短的計算cnt cntcn t。那為什麼一定要從長到短呢?比如回文自動機就直接是按照節點編號從大到小計算cnt cntcn t 罪...