【HDU 2222】Keywords Search AC自动机模板题
参考iwtwiioi的模板写出来的。上午gty讲的并没有听懂,只好自己慢慢对着模板理解。
在HDU上为什么相同的程序提交有时T有时A!!!
奉上sth神犇的模板(不是这道题):
var
ch:char;
q,g,num:array [0..500001] of longint;
st:string;
son:array [0..500001,'a'..'z'] of longint;
ts:array [0..1000001] of char;
l,s,t,n,i,j,m,k,ans,head,tail:longint;
begin
readln(t);
while t<>0 do
begin
for ch:='a' to 'z' do begin son[0,ch]:=1; son[1,ch]:=0; end;
dec(t);
s:=1;
g[1]:=0;
fillchar(num,sizeof(num),0);
readln(n);
for i:=1 to n do begin
readln(st);
m:=length(st);
l:=1;
for j:=1 to m do
if son[l,st[j]]<>0 then l:=son[l,st[j]]
else begin
inc(s);
g[s]:=0;
son[l,st[j]]:=s;
l:=s;
for ch:='a' to 'z' do son[s,ch]:=0;
end;
inc(num[l]);
end;
s:=1;
head:=0;
tail:=1;
q[1]:=1;
n:=0;
while head<tail do
begin
inc(head);
k:=q[head];
for ch:='a' to 'z' do
if son[k,ch]=0 then son[k,ch]:=son[g[k],ch]
else begin g[son[k,ch]]:=son[g[k],ch];
inc(tail);
q[tail]:=son[k,ch];
end;
end;
然后是我的ACcode:
#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define for1(i,a,n) for(int i=(a);i<=(n);++i)
#define for2(i,a,n) for(int i=(a);i<(n);++i)
#define for3(i,a,n) for(int i=(a);i>=(n);--i)
#define for4(i,a,n) for(int i=(a);i>(n);--i)
#define CC(i,a) memset(i,a,sizeof(i));
using namespace std;
char a[10010],s[1000010];
int ch[500010][30],fail[500010],w[500010],ans,cnt;
inline void ins(char *b){
int u=0,v,len=strlen(b);
for2(i,0,len){
v=b[i]-'a';
if (!ch[u][v])ch[u][v]=cnt++;
u=ch[u][v];
}w[u]++;
}
inline void bfs(){
queue<int>q;
q.push(0);
int u,p;
while (!q.empty()){
u=q.front();q.pop();
for2(i,0,26) if (ch[u][i]){
q.push(ch[u][i]);
if (!u) continue;
p=fail[u];
while (p&&!ch[p][i])p=fail[p];
fail[ch[u][i]]=ch[p][i];
}
}
}
inline void ac(char *b){
int u=0,v,len=strlen(b),t;
for2(i,0,len){
v=b[i]-'a';
while (u&&!ch[u][v])u=fail[u];
u=ch[u][v];
t=u;
while (t){
ans+=w[t];
w[t]=0;
t=fail[t];
}
}
}
inline void init(){CC(fail,0);CC(ch,0);CC(w,0);ans=0;cnt=1;}
int main(){
int T;scanf("%d",&T);
while (T--){
init(); int n;
scanf("%d",&n);
for1(i,1,n){
scanf("%s",a);
ins(a);
}bfs();
scanf("%s",s);
ac(s);
printf("%d\n",ans);
}return 0;
}
【HDU 2222】Keywords Search AC自动机模板题的更多相关文章
- HDU 2222 Keywords Search(AC自动机模板题)
学习AC自动机请戳这里:大神blog........ 自动机的模板: #include <iostream> #include <algorithm> #include < ...
- HDU 2222 Keywords Search (AC自动机)(模板题)
<题目链接> 题目大意: 给你一些单词,和一个字符串,问你这个字符串中含有多少个上面的单词. 解题分析: 这是多模匹配问题,如果用KMP的话,对每一个单词,都跑一遍KMP,那么当单词数量非 ...
- hdu 2222 Keywords Search ac自动机模板
题目链接 先整理一发ac自动机模板.. #include <iostream> #include <vector> #include <cstdio> #inclu ...
- hdu 2222 Keywords Search ac自动机入门
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2222 题意:有N(N <= 10000)个长度不超过50的模式串和一个长度不超过1e6的文本串. ...
- hdu 2222 Keywords Search——AC自动机
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2222 第一道AC自动机! T了无数边后终于知道原来它是把若干询问串建一个自动机,把模式串放在上面跑:而且只 ...
- HDU 2222 Keywords Search (AC自动机)
题意:就是求目标串中出现了几个模式串. 思路:用int型的end数组记录出现,AC自动机即可. #include<iostream> #include<cstdio> #inc ...
- Match:Keywords Search(AC自动机模板)(HDU 2222)
多模匹配 题目大意:给定很多个字串A,B,C,D,E....,然后再给你目标串str字串,看目标串中出现多少个给定的字串. 经典AC自动机模板题,不多说. #include <iostream& ...
- POJ2222 Keywords Search AC自动机模板
http://acm.hdu.edu.cn/showproblem.php?pid=2222 题意:给出一些单词,求多少个单词在字符串中出现过(单词表单词可能有相同的,这些相同的单词视为不同的分别计数 ...
- Keywords Search(AC自动机模板)
Keywords Search Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others ...
随机推荐
- Selenium2怎么调用selenium1中方法
虽然selenium1.0已经成为过去时,现在都用selenium2.0,但是如果想要在代码中调用selenium1.0的api怎么办,看下面 WebDriver driver = new Chrom ...
- 该如何认识ZBrush中的2.5D绘画
ZBrush不仅对3D行业进行了改革.让艺术家感到无约束自由创作的3D设计,同时它还是一个强大的绘画程序!基于强大的Pixol功能,ZBrush®将数字绘画提升到一个新的层次.如下图所示,插画功能主要 ...
- 详解Java的MyBatis框架中SQL语句映射部分的编写
这篇文章主要介绍了Java的MyBatis框架中SQL语句映射部分的编写,文中分为resultMap和增删查改实现两个部分来讲解,需要的朋友可以参考下 1.resultMap SQL 映射XML 文件 ...
- Unity 2D Sprite Lighting
2D游戏中也可以使用灯光?这真是一个好消息,接下来,我将为大家写一下教程 操作步骤 1.创建一个Materilas,修改Shader为 2.创建一个Sprite(使用黑色的图片) 3.创建一个Poin ...
- Android中的三种XML解析方式
在Android中提供了三种解析XML的方式:SAX(Simple API XML),DOM(Document Objrect Model),以及Android推荐的Pull解析方式.下面就对三种解析 ...
- 关于 app测试工具
1. 腾讯的GT 2. testin 云测 3. monkey的自动化测试 4. 纯手工的功能测试.
- GitHub入门之一:使用github下载项目
git作为目前比较流行的版本控制系统,被各个互联网公司广泛使用着.目前国外的网站有GitHub,国内的有CSDN和OSCHINA的git. 使用git可以很方便地进行多人协作和版本控制.作为一个入门小 ...
- Chrome 开发工具 Javascript 调试技巧
http://www.w3cplus.com/tools/dev-tips.html 一.Sources 面板介绍: Sources 面板分为左中右 3 部分左:Sources 当前页面加载的资源列表 ...
- sqlSQL2008如何创建定时作业(代理服务)(转)
SQL2008如何创建定时作业?此方法也适应于Sql Server2005数据库,有兴趣的可以来看下! 1.打开[SQL Server Management Studio],在[对象资源管理器]列表中 ...
- 基于Nodejs生态圈的TypeScript+React开发入门教程
基于Nodejs生态圈的TypeScript+React开发入门教程 概述 本教程旨在为基于Nodejs npm生态圈的前端程序开发提供入门讲解. Nodejs是什么 Nodejs是一个高性能Ja ...