AC自動機 玄武密碼

2022-06-20 00:57:09 字數 1174 閱讀 5687

【題目鏈結】

【題意】

對於每一段文字,其字首在母串上的最大匹配長度是多少呢

【參考別人的題解】

我們只需要先建立所有密碼的trie樹

再以母串為主串跑乙個ac自動機

不過其中還是有一些需要改動的地方

原本字典樹中用來記錄某個節點是不是字串結尾的陣列不需要,直接刪去

我們需要另乙個陣列來標記哪些點被匹配

跑完ac自動機後從trie樹上找最後乙個匹配的點即可

優化:由於nxt陣列是遞迴到0的所以只要有乙個點被標記過,那麼這個點到0的所有點都已經被遍歷過直接退出即可

【自己理解】

其實這個題目就是套路。

1、建模式串的ac自動機。

2、利用文字串跑一遍ac自動機,把對應的位置標記上。

3、再跑一遍模式串,去最長的位置就是答案了。

【**】

1 #include2 #include3 #include4

using

namespace

std;

5const

int m = 2e7 + 5;6

const

int n = 2e5+5;7

char

t[m];

8char p[n][205];9

int trie[m][4

],match[m],fail[m],cnt[m];

10int

q[m],head,tail;

11int n,m,idx=1;12

13int calc( char

x )19

void insert(char s,int

id)27 match[id] =p ;28}

29void

build()else44}

45}46}

47void query(char

t)56}57

58for(int i=1;i<=m;i++)

64 printf("

%d\n

",res);65}

66}67int

main()

6875

build();

76query(t);

77return0;

78 }

玄武密碼

JSOI2012 玄武密碼 題解 AC自動機

顯然是ac自動機對吧 插入單詞之後把文章在自動機上跑一遍,到達過的節點打上花火標記 之後檢查一下每個單詞有幾個標記即可 可以把題目中的4個字母對映成abcd方便遍歷 include include include include using namespace std const int n 1e7...

AC自動機 建立nlogn個AC自動機

string set queries 題意 給你3種操作,1 加入乙個串到集合中。2 刪除集合中的某乙個串 3 查詢集合中的字串在給定的字串種出現幾次。同乙個串可重複 解法 建立多個ac自動機,用二進位制分組來處理。加入給你21個串 分為 16 4 1,再新增乙個串的時候,即21 1,22 16 4...

AC自動機及字尾自動機

ac自動機是一種基於trie樹的演算法,其本質和kmp上的處理很相似。trie樹結構 kmp轉移思路 ac自動機組要由三個部分組成 trie樹的建立 fail指標的匹配 對ac自動機的詢問 每次建立自動機會有一次初始化 ac自動機類 struct node node結構體 struct ac voi...