AC自动机-HDU2222-模板题
http://acm.hdu.edu.cn/showproblem.php?pid=2222
一个AC自动机的模板题。用的kuangbin的模板,静态建Trie树。可能遇到MLE的情况要转动态建树。
AC自动机的讲解看这里
http://blog.csdn.net/niushuai666/article/details/7002823
http://blog.csdn.net/mobius_strip/article/details/22549517
- /*--------------------------------------------------------------------------------------*/
- // Helica's header
- // Second Editions
- // 2015.11.7
- //
- #include <algorithm>
- #include <iostream>
- #include <cstring>
- #include <ctype.h>
- #include <cstdlib>
- #include <cstdio>
- #include <vector>
- #include <string>
- #include <queue>
- #include <stack>
- #include <cmath>
- #include <set>
- #include <map>
- //debug function for a N*M array
- #define debug_map(N,M,G) printf("\n");for(int i=0;i<(N);i++)\
- {for(int j=;j<(M);j++){\
- printf("%d",G[i][j]);}printf("\n");}
- //debug function for int,float,double,etc.
- #define debug_var(X) cout<<#X"="<<X<<endl;
- /*--------------------------------------------------------------------------------------*/
- using namespace std;
- int N,M,T;
- struct Trie
- {
- int next[][],fail[],end[];
- int root,L;
- int newnode()
- {
- for(int i=;i<;i++) next[L][i] = -;
- end[L++] = ;
- return L-;
- }
- void init()
- {
- L = ;
- root = newnode();
- }
- void insert(char *s)
- {
- int len = strlen(s);
- int now = root;
- for(int i=;i<len;i++)
- {
- if(next[now][s[i]-'a'] == -)
- next[now][s[i]-'a'] = newnode();
- now = next[now][s[i]-'a'];
- }
- end[now]++;
- }
- void build()
- {
- queue <int> Q;
- fail[root] = root;
- for(int i=;i<;i++)
- if(next[root][i] == -)
- next[root][i] = root;
- else
- {
- fail[next[root][i]] = root;
- Q.push(next[root][i]);
- }
- while(!Q.empty())
- {
- int now = Q.front();
- Q.pop();
- for(int i=;i<;i++)
- {
- if(next[now][i] == -)
- next[now][i] = next[fail[now]][i];
- else
- {
- fail[next[now][i]] = next[fail[now]][i];
- Q.push(next[now][i]);
- }
- }
- }
- }
- int query(char *s)
- {
- int len = strlen(s);
- int now = root;
- int ans = ;
- for(int i=;i<len;i++)
- {
- now = next[now][s[i]-'a'];
- int temp = now;
- while(temp != root)
- {
- ans += end[temp];
- end[temp] = ;
- temp = fail[temp];
- }
- }
- return ans;
- }
- void debug()
- {
- for(int i=;i<L;i++)
- {
- printf("id = %3d,fail = %3d,end = %3d,chi = [",i,fail[i],end[i]);
- for(int j=;j<;j++)
- printf("%2d",next[i][j]);
- printf("]\n");
- }
- }
- };
- char buf[];
- Trie ac;
- int main()
- {
- scanf("%d",&T);
- while(T--)
- {
- ac.init();
- scanf("%d",&N);
- for(int i=;i<N;i++)
- {
- scanf("%s",buf);
- ac.insert(buf);
- }
- ac.build();
- //ac.debug();
- scanf("%s",buf);
- printf("%d\n",ac.query(buf));
- }
- }
第N次入门AC自动机。。。成功。。。
AC自动机-HDU2222-模板题的更多相关文章
- AC自动机-HDU2896-模板题
http://acm.hdu.edu.cn/showproblem.php?pid=2896 另一道AC自动机的模板题,不过这题需要记录一下具体的匹配情况. /*------------------- ...
- hdu 3695:Computer Virus on Planet Pandora(AC自动机,入门题)
Computer Virus on Planet Pandora Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 256000/1280 ...
- [hdu2222]ac自动机(模板)
题意:一个文本串+多个模板串的匹配问题 思路:裸的ac自动机. #pragma comment(linker, "/STACK:10240000,10240000") #inclu ...
- AC自动机 (模板)
AC自动机是用来干什么的: AC自动机是用来解决多模匹配问题,例如有单词s1,s2,s3,s4,s5,s6,问:在文本串ss中有几个单词出现过,类似. AC自动机实现这个功能需要三个部分: 1.将所有 ...
- AC自动机及其模板
模板 #include<queue> #include<stdio.h> #include<string.h> using namespace std; ; ; ; ...
- AC自动机(模板+例题)
首先要明白AC自动机是干什么的: AC自动机其实就是一种多模匹配算法,那么你可能会问什么叫做多模匹配算法.下面是我对多模匹配的理解,与多模与之对于的是单模,单模就是给你一个单词,然后给你一个字符串,问 ...
- HDOJ-3065(AC自动机+每个模板串的出现次数)
病毒侵袭持续中 HDOJ-3065 第一个需要注意的是树节点的个数也就是tree的第一维需要的空间是多少:模板串的个数*最长模板串的长度 一开始我的答案总时WA,原因是我的方法一开始不是这样做的,我是 ...
- AC自动机-HDU3065-简单题
http://acm.hdu.edu.cn/showproblem.php?pid=3065 需要记录匹配情况的AC自动机,没有清空一些数组导致wa了几发. /*------------------- ...
- luogu AC自动机(模板)
完全忘了AC自动机怎么写了qwq,更别说AC自动机上DP了. 今天就好好地学习字符串好了qwq 提一下AC自动机的时间复杂度--设n是模式串的个数,m是文本串的长度,l是模式串的平均长度,那么它的时间 ...
随机推荐
- 最近开始学习Cesium,学习学习。
最近开始学习Cesium,学习学习.
- 如何修改Oracle服务IP地址
oracle数据库所在的机器更改IP地址后,发现无法连接,解决这个问题,需要修改一下对应的文件: F:\app\zhaohe\product\11.2.0\dbhome_1\NETWORK\ADMIN ...
- Ajax获取 Json文件提取数据
摘自 Ajax获取 Json文件提取数据 1. json文件内容(item.json) [ { "name":"张国立", "sex":&q ...
- 【转】单KEY业务,数据库水平切分架构实践
本文将以“用户中心”为例,介绍“单KEY”类业务,随着数据量的逐步增大,数据库性能显著降低,数据库水平切分相关的架构实践: 如何来实施水平切分 水平切分后常见的问题 典型问题的优化思路及实践 一.用户 ...
- 轻量级WebApi请求插件:PostMan
时间很宝贵,废话不多说,只说三句,如下: 十年河东,十年河西,莫欺骚年穷!~_~ 打错个字,应该是莫欺少年穷! 学历代表你的过去,能力代表你的现在,学习代表你的将来. 学无止境,精益求精. 本次介绍的 ...
- java.lang.IllegalStateException: Failed to load property source from location 'classpath:/application-dev.yml'
如果你的项目没有配置错误,配置文件名称也正常,还出现这个问题,那一定是你的yml文件编码的问题 先附上一张项目架构图 当我启动服务器寻找配置文件的时候,服务器提示这样的错误信息 java.lang.I ...
- Mysql读写分离方案-Amoeba环境部署记录
Mysql的读写分离可以使用MySQL Proxy,也可以使用Amoeba.Amoeba(变形虫)项目是一个类似MySQL Proxy的分布式数据库中间代理层软件,是由陈思儒开发的一个开源的java项 ...
- Spring RPC 入门学习(1)-HelloWorld入门
Spring搭建RPC环境 第一,下载所需要的jar包,下载地址:https://yunpan.cn/cPErQeANrSMyB (提取码:63e5),见下图: 第二,新建动态WebProject,把 ...
- require.ensure的用法;异步加载-代码分割;
webpack异步加载的原理 webpack ensure相信大家都听过.有人称它为异步加载,也有人说做代码切割,那这 个家伙到底是用来干嘛的?其实说白了,它就是把js模块给独立导出一个.js文件的, ...
- react/React Native 在 import 导入时,有的带花括号{},有的不带原理解析
在使用import引用模块时,如何正确使用{} 例如:有两个文件,home.js.user.js 一:不使用{}: 当需要在home.js中引入user.js的时候 //home.js 文件中impo ...