jzoj1566 單詞查詢 AC自動機

2021-08-21 14:28:47 字數 1074 閱讀 7975

給乙個主串s以及m個字串。問這m個字串在主串中出現多少次。

ac自動機模板

哈哈,表達一下激動之情,我終於寫完了!!!

ac自動機=trie樹+fail指標(形同kmp的next陣列)

是一種多模匹配演算法,就是同時與多個字串比對

主要包括三個步驟:建字典樹,處理fail指標,匹配

建字典樹是沒什麼好注意的

fail指標的作用是在匹配失敗時可以繼續匹配,不丟失匹配失敗前未計入答案的匹配記錄

而處理fail指標概括起來就是:沿著x父親的fail指標走,若指向的節點兒子中有與x相同的點,那麼x的fail指標指向與它相同的這個點,否則繼續沿著指向的節點的fail指標走,重複步驟,知道fail指標指向樹根,那麼x的fail指標指向樹根

具體做法用廣搜進行,先把根節點加入佇列,然後把它的兒子們也加入佇列,處理出兒子們的fail指標;繼續調出隊頭節點,把它的兒子們加入佇列,處理出兒子們的fail指標

匹配具體做法是:設上乙個匹配的是節點x,這一次串匹配到第i位,那麼若節點x的兒子中有字串中i所對應的字元,那麼這一步匹配到這個符合條件的兒子,否則一直沿著x的fail指標走,直到有與i相同的字元或到達根節點。每次匹配成功乙個節點都判斷當前點是否是m個字串的結尾之一,加上答案,還要把當前點的fail指標指向的點加入答案

#include 

#include

using namespace std;

int t[60004][27],b[30004];

int fail[30004];

int cnt=1,s,m,ans;

char c[2000006];

intq[30004];

void insert()

}b[j]++;

}void ac_mach()}}

}}void ac_work()

}int main()

ac_mach();

scanf("%s",c);

ac_work();

printf("%d",ans);

return

0;}

單詞統計 AC自動機

1118.單詞統計 time limit 1000 ms memory limit 32768 kb total submission s 12 accepted submission s 1 description 給定乙個字串和若干個單詞,統計這些單詞在這個字串中出現的次數。input 第一行為...

BZOJ 3172 單詞 (AC自動機)

這道題是個裸的ac自動機,但是我還是調了很久qaq。首先如果我們直接用每個單詞來匹配的,時間不是很理想。這道題要用到ac自動機的衍生物 fail樹 我也是做這道題才知道有這個東西 fail樹有這麼乙個結論 乙個字串出現的次數等於以它為根節點的fail樹的子樹中所有節點的cnt的和。根據這個結論,我們...

bzoj3172 單詞 AC自動機

感覺以前寫過。bzoj上不去我也不知道 跑一遍ac自動機,每乙個節點儲存一下屬於多少字串,為它的權值。然後乙個節點表示的字串在整個字典中出現的次數相當於其在fail樹中的子樹的權值的和。ac自動機不要寫掛就好了。ac 如下 include include include define n 11000...