P3808 模板 AC自動機(簡單版)

2022-07-20 04:24:13 字數 963 閱讀 9476

給定n個模式串和1個文字串,求有多少個模式串在文字串裡出現過。

第一行乙個n,表示模式串個數;

下面n行每行乙個模式串;

下面一行乙個文字串。

乙個數表示答案

2aaa

aa

2
subtask1[50pts]:∑length(模式串)<=106,length(文字串)<=106,n=1;

subtask2[50pts]:∑length(模式串)<=106,length(文字串)<=106;

ac自動機板子

近期得知有乙個trie圖優化,要不然容易被卡雖然從來沒被卡過

而且優化後的及其好寫

正常來說,乙個節點的fail等於父親的fail鏈上最近的這個兒子

我們需要不斷跳fail,這樣很慢

優化:如果乙個節點沒有c兒子,就讓它連上fail鏈上最近的c兒子

這個可以遞推出來

這樣,乙個點的fail就是父親fail的這個兒子,就沒了,也不用暴力跳了

而且匹配的時候,可以發現,不會有空節點,一直跳就行了

#include#define ll long long

ll in()

struct ac

void *operator new (size_t)

}; node *root;

public:

ac()

void ins(char *s)

o->num++;

} void build()

else

}} }

int query(char *s)

return ans;

}}b;

const int maxn = 1e6 + 100;

char s[maxn];

int main()

P3808 模板 AC自動機(簡單版)

這是一道簡單的ac自動機模板題。用於檢測正確性以及演算法常數。為了防止卡oj,在保證正確的基礎上只有兩組資料,請不要惡意提交。給定n個模式串和1個文字串,求有多少個模式串在文字串裡出現過。輸入格式 第一行乙個n,表示模式串個數 下面n行每行乙個模式串 下面一行乙個文字串。輸出格式 乙個數表示答案 輸...

P3808 模板 AC自動機(簡單版)

學習1 小蒟蒻yyb的部落格 學習2 大佬的板子 ac自動機 求多個模式串在文字串 現的次數 trie樹 根節點為0 int cnt 0 編號 void clear int x void build string s now ac now vis s i a ac now end 標記單詞結尾 qu...

P3808 模板 AC自動機(簡單版)

題意 給定n個模式串和1個文字串,求有多少個模式串在文字串裡出現過。思路 建完tire,fail之後,開始跑自動機,然後對於走過的點,給乙個標記,防止多次計算即可 為啥呢,因為求得是有多少模式串在文字串出現過,而不是出現次數 1 include2 using namespace std 3const...