首页 > 其他分享 >P3808 【模板】AC 自动机(简单版)

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

时间:2022-08-31 13:35:13浏览次数:73  
标签:AC int tr cnt char ++ P3808 fail 模板

题目链接

代码

#include <iostream>
#include <cstdio>
using namespace std;
const int N = 1000010;
int n;
char str[N];
int tr[N][26],cnt[N],idx;
int fail[N],q[N];
void insert (char s[N]) {
	int p = 0;
	for (int i = 0;s[i];i++) {
		int t = s[i] - 'a';
		if (!tr[p][t]) tr[p][t] = ++idx;
		p = tr[p][t];
	}
	cnt[p]++;
}
void get_fail () {
	int hh = 0,tt = -1;
	for (int i = 0;i < 26;i++) {
		if (tr[0][i]) q[++tt] = tr[0][i];
	}
	while (hh <= tt) {
		int t = q[hh++];
		for (int i = 0;i < 26;i++) {
			int p = tr[t][i];
			if (!p) tr[t][i] = tr[fail[t]][i];
			else {
				fail[p] = tr[fail[t]][i];
				q[++tt] = p;
			}
		}
	}
}
int main () {
	scanf ("%d",&n);
	for (int i = 1;i <= n;i++) {
		char x[N];
		scanf ("%s",x);
		insert (x);
	}
	get_fail ();
	scanf ("%s",str);
	int ans = 0;
	for (int i = 0,j = 0;str[i];i++) {
		int t = str[i] - 'a';
		int p = j = tr[j][t];
		while (p && cnt[p]) {  //这里如果某一个点不是单词节点,就可以直接退掉
			ans += cnt[p];
			cnt[p] = 0;
			p = fail[p];
		}
	}
	printf ("%d\n",ans);
    return 0;
}

标签:AC,int,tr,cnt,char,++,P3808,fail,模板
From: https://www.cnblogs.com/incra/p/16642776.html

相关文章

  • Oracle 服务器迁移的一些经验
    前言通过此文章来分享一下Oracle服务器迁移过程中的一些经验,希望对大家有些许帮助。本文旨在帮助更多的同学,会提及一些基本命令或技巧,但不赘述,后续有机会再进一步分享......
  • Gosper's Hack 算法
    XIN队算法之枚举组合.枚举组合的一个非递归做法叫Gosper'sHack算法,思路就是对每个组合,用01串表示其选或不选,这样必然可以表示所有组合.我们考虑如何生成一个组合......
  • $.each()
    循环数组//index:索引//item:数组项$.each(array,function(index,item){......})循环对象//key:key//value:value$.each(obj,function(key,value){......
  • mac ios xcode profile过期遇到的问题记录 No signing certificate iOS Development f
    profile过期了,重新生成并下载证书,仍然提示错误:Nosigningcertificate"iOSDevelopment"found然后在下面的ManageCertificate点开后,发现有警告:Theoperationcouldn’t......
  • React + Antd实现动态切换主题功能
    本文摘自【前端早茶】React+Antd实现动态切换主题功能前言最近去antdesign官网查阅资料,发现antdesign最新版本已经更新到了4.17.x,于是比较粗略的看了一下最近几......
  • mac使用touchid解锁sudo
    打开“终端”,执行以下命令:sudosed-i".bak"'2s/^/authsufficientpam_tid.so'$'\n/g'/etc/pam.d/sudo然后输入您的管理员密码,回车,大功告成了!不用重启哦~......
  • APISpace送中秋团圆API好礼
    中秋佳节即将来到,APISpace为大家带来了优惠好礼,推荐热门API限时大优惠,同时新用户注册APISpace将获得160元的优惠券大礼包!!  在意味着团团圆圆的中秋,不要忘了给你......
  • 如何使用CleanMyMac X的空间透镜功能快速决策清理垃圾?
    CleanMyMac是一款专业的苹果电脑清理软件,它支持快速清扫电脑垃圾、卸载应用程序和清理隐私痕迹等常用功能,同时还支持使用其强大的空间透镜功能,像Windows系统一样实时浏览电......
  • CleanMyMac清理垃圾时频繁要求输入密码如何解决?
    有不少用户反馈在使用CleanMyMac清理系统垃圾文件的时候会频繁要求输入开机密码,想要进行更改,不管是新版本还是老版本都是这样,今天小编为您带来了CleanMyMac清理垃圾时频繁......
  • webPack安装
    WebPack:全局安装:安装到npm默认的依赖包目录在任意目录执行:npminstall-gwebpack或cnpminstall-gwebpack本地安装:安装指定应用程序目录......