AC自動機學習總結

2021-09-30 19:49:20 字數 1543 閱讀 1670

久聞ac自動機的大名,終於,在準備好kmp和字典樹之後,開始學習這個看起來高大上的演算法了。

多餘的寫題的時候在補充吧,學完之後發現他的板子並不難,理解也不算太難,網上有很多種寫法,近期研究一下,一些**的常數的問題。洛谷有道題,直接就是板子:

參考不知名大佬的板子(看了好多人的板子了),然後放棄指標,因為覺得要申請空間,好慢啊。

p3808:

ac:

// luogu-judger-enable-o2

//#pragma comment(linker, "/stack:1024000000,1024000000")

#include#include#include//#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define ll long long

#define pair pair//#define max(a,b) (a)>(b)?(a):(b)

//#define min(a,b) (a)<(b)?(a):(b)

//#define clean(a,b) memset(a,b,sizeof(a))// 水印

//std::ios::sync_with_stdio(false);

// register

const int maxn=5e6+10;

const int inf32=0x3f3f3f3f;

const ll inf64=0x3f3f3f3f3f3f3f3f;

const int mod=998244353;

const double pi=acos(-1.0);

struct nodetrie[maxn];

int que[maxn];

char s[maxn];

int ecnt=0;

void insert(char *s)

} while(que.size())//下面就可以直接連線fail了。

trie[index].fail=trie[trie[tmp].fail].nxt[i];

que.push(index);

} }}//void get_fail()

// }

// while(head// trie[index].fail=trie[trie[tmp].fail].nxt[i];

// que[tail++]=index;

// }

// }

//}int ac_automation(char *s)

id=trie[id].nxt[s[i]-'a'];

} return ans;

}int main()

get_fail();

scanf("%s",s);

printf("%d\n",ac_automation(s));}/*

4 2abcd

bceabd

cdabcdefg

*/

AC自動機總結

講解 ac自動機講解1 ac自動機講解2 1.模版題 hdu2222 include include include using namespace std int k int n char s 10010 60 char mat 1100000 int cnt struct node trie 1...

AC自動機總結

考慮kmp問題的公升級版,即有多個模式串,單個文字串。問匹配次數。考慮對於每乙個模式串建乙個 fail 然後對於每乙個模式串都和文字串暴力跑。前置知識 trie樹,bfs 沒什麼好說的。演算法實現 我們考慮將所有的模式串放到一顆 trie 樹,如果匹配失敗的話轉移到 fail 指標上面去,這樣子複雜...

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

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