AC自動機 講解 模板

2021-09-10 09:03:29 字數 2523 閱讀 1788

首先  先給你q 個查詢串 ,再給你乙個主串s (或者很多個不同主串)

q個查詢串 有幾個   在主串裡  匹配成功了  可以記個cnt統計(查詢串不重複,重複的要計算數量的話,要加個sum記錄 重複查詢串 出現了幾次)

還可以知道 匹配成功 的查詢串是哪些(偷懶還用  sum標 它是第幾個查詢串)

字典樹就不用說了吧,建字典樹還是很好理解的

假設先匹配成功了一小段,那麼找下乙個字母,匹配成功的這一段的最後乙個 的下乙個字元。

貼上**

#include #include #include #include #include #include #include #include #include #include #include #include #define clear( x , y ) memset( x , y , sizeof(x) );

#define qcin() std::ios::sync_with_stdio(false);

using namespace std;

typedef long long ll;

const int maxn = 1e4 + 200;

const int inf = 1e9 + 7;

const int max = 1e7;

int cnt , n;

struct node;

node *root , *q[max] , *newnode;

char key[210];

char pattern[maxn];

int head,tail;

void insert(char *s)

p = p->next[x];

}p->sum++;

}void build_fail_pointer()

else

p = p->fail;

}if(p == null) temp->next[i]->fail = root;

}q[tail++] = temp->next[i];}}

}}void ac_automation(char *ch)

else break;

temp = temp->fail;}}

}int main()

gets(pattern);

cnt = 0;

build_fail_pointer();

ac_automation(pattern);

printf("%d\n",cnt);

}return 0;

}

感覺**還能更好看一點

//hdu 2896

#include #include #include #include #include #include #include #include #include #include #include #include #define printstring(ss) printf("%s\n",ss);

#define clear( x , y ) memset( x , y , sizeof(x) );

#define qcin() std::ios::sync_with_stdio(false);

using namespace std;

typedef long long ll;

const int maxn = 1e4 + 200;

const int inf = 1e9 + 7;

const int over = 130;

int cnt , n;

struct node

fail = null;

sum = 0;

}};node *root , *newnode;

char key[210];

char pattern[maxn];

int head,tail;

void insert(char *s , int num)

p = p->next[x];

} p->sum = num;

}queue q;

void build_fail_pointer() else

p = p->fail;

}if(p == null) temp->next[i]->fail = root;

}q.push(temp->next[i]);

}} }

}vector ans;

void ac_automation(char *ch)

else break;

temp = temp->fail;

} }}int main()

build_fail_pointer();

int q; scanf(" %d",&q);

cnt = 0;

for(int i = 1 ; i <= q ; i++)

printf("\n");

} }printf("total: %d\n",cnt);

return 0;

}

AC自動機講解

飄過的小牛 ac自動機簡介 首先簡要介紹一下ac自動機 aho corasick automation,該演算法在1975年產生於貝爾實驗室,是著名的多模匹配演算法之一。乙個常見的例子就是給出n個單詞,再給出一段包含m個字元的文章,讓你找出有多少個單詞在文章裡出現過。要搞懂ac自動機,先得有字典樹t...

AC自動機講解

首先,作為作者的我一定知道你已經會了這兩個演算法 kmp與trie樹,如若不會,可以先學習一下。我在這裡宣告一下ac自動機不是自動ac的演算法,其全稱是aho corasick automaton,是一種著名的多模匹配演算法。其實現類似於trie樹與kmp演算法的結合,是將多個模式串放在trie樹上...

AC自動機模板

ac自動機模板 ac自動機模板 使用方法 1 init 初始化函式 2 insert str 插入字串函式 3 build 構建ac自動機 4 query str 返回出現的字串個數 使用需注意事項 1 注意輸入的字元的範圍,需對next和其二維大小及相關引數進行更改 2 注意next fail和e...