【題目鏈結】
【題意】
對於每一段文字,其字首在母串上的最大匹配長度是多少呢
【參考別人的題解】
我們只需要先建立所有密碼的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...