題目描述
給定n個模式串和1個文字串,求有多少個模式串在文字串裡出現過。
輸入格式
第一行乙個n,表示模式串個數;
下面n行每行乙個模式串;
下面一行乙個文字串。
輸出格式
乙個數表示答案
輸入輸出樣例
輸入 #12a
aaaa
輸出 #1
2說明/提示
subtask1[50pts]:∑length(模式串)<=106,length(文字串)<=106,n=1; subtask1[50pts]:∑length(模式串)<=106,length(文字串)<=106,n=1;
運用結構:trie樹和kmp;
思路:先建一顆trie樹,然後用bfs搜尋節點失敗建立fail指標,
---------最後再遍歷文字串統計σ
\sigma
σed[i]即可。
以下為**:qwq
#include
#define n 1005000
using namespace std;
char s[n]
,t[n]
;int tree[n][26
];int ed[n]
,fail[n]
,last[n]
;int n,tot;
void
build
(char
*s) p=tree[p]
[c];
} ed[p]++;
}void
getfail()
}while
(!q.
empty()
) q.
push
(p);
int v=fail[r]
;while
(v&&
!tree[v]
[i])v=fail[v]
; fail[p]
=tree[v]
[i];
if(ed[fail[p]
])last[p]
=fail[p]
;else last[p]
=last[fail[p]];
}}}int
search
(char
*s)}
return cnt;
}int
main()
getfail()
;scanf
("%s"
,s);
int ans=
search
(s);
printf
("%d\n"
,ans)
;return0;
}
AC自動機(簡單版)
覺得ac自動機怪簡單是怎麼回事?可能題太裸了 網上講ac自動機和tire樹講的比我好的dalao數不勝數,我就不多贅述了,權當是掛個板子吧。其實char和strlen還是挺好用的。include include include using namespace std struct tire tr 1...
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...