【补题】AC自动机的三道模板题

AC自动机三道模板题

虽然是模板题,但是写出来的全是WA自动机

P3808 【模板】AC 自动机(简单版)

P3808 【模板】AC 自动机(简单版)

这道题是AC自动机的模板题,只需要老老实实建立fail指针,建fail时顺带建边优化fail即可。

题目要求,求文本串中出现了几个模式串,只需要记录end,然后跳fail就行(为什么要跳fail可以画个图,顺便再把fail独立出来)。

只要在用的时候不要忘了调用建fail就行。

下面是一个模板。

struct ACAM {
   
  	int child[MAXN][SIZE], tot, end[MAXN], fail[MAXN];
	void insert(const string &s) {
   
        int now = 0;
        for (auto x : s) {
   
            int cl = x - 'a';
            if (!child[now][cl])
                child[now][cl] = ++ tot;
            now = child[now][cl];
        }
        end[now] ++;
    }
    void build() {
   
        queue<int>q;
        for (int i = 0; i < SIZE; ++ i)
            if (child[0][i])  // 本来这里要连边的,不过已经完成了
                q.push(child[0][i]);
        while (!q.empty()) {
   
            int now = q.front();
            q.pop();
            for (int i = 0; i < SIZE; ++ i) {
   
                if (child[now][i])  // 建fail
                    fail[child[now][i]] = child[fail[now]][i], q.pushi(child[now][i]);
                else  // 连边优化
                    child[now][i] = child
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值