1、HDU 2222

2、题意:给出n个单词,一个字串,求有多少个单词在字串里出现了。注意给出的单词可能会重复,重复的不计。

3、总结:入门题。在查询这里还是不太懂。

//
#include<bits/stdc++.h>
using namespace std;
#pragma comment(linker, "/STACK:102400000,102400000")
#define F(i,a,b) for (int i=a;i<b;i++)
#define FF(i,a,b) for (int i=a;i<=b;i++)
#define mes(a,b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
typedef long long ll;
const int N = 1e6+; struct node
{
int count;
node *next[];
node *fail;
void init() { //初始化
mes(next,NULL);
count=;
fail=NULL;
}
}*q[];
node *root;
int head,tail;
char str[N]; void insert(char *keyword)
{
int len=strlen(keyword);
node *p=root;
for(int i=; i<len; i++) {
int index=keyword[i]-'a';
if(p->next[index]==NULL) p->next[index]=new node(); //注:这里要new申请内存,不要忘了
p=p->next[index];
}
p->count++;
} void build_ac_automation() //初始化fail指针,BFS
{
q[tail++]=root;
while(head!=tail) {
node *p=q[head++]; //弹出队头
node *temp=NULL;
for(int i=; i<; i++) {
if(p->next[i]!=NULL) {
if(p==root) p->next[i]->fail=root; //第一个元素fail必指向根
else {
temp=p->fail;
while(temp) { //2种情况结束:匹配为空or找到匹配
if(temp->next[i]) { //找到匹配
p->next[i]->fail=temp->next[i];
break;
}
temp=temp->fail;
}
if(!temp) p->next[i]->fail=root; //为空则从头匹配
}
q[tail++]=p->next[i]; //入队
}
}
}
} void query() //扫描,查询这里还是没太搞懂
{
int i=,cnt=,index,len=strlen(str);
node *p=root;
for(int i=; str[i]; i++) {
index=str[i]-'a';
while(p->next[index]==NULL&&p!=root) p=p->fail; //跳转失败指针
p=p->next[index];
if(p==NULL) p=root;
node *temp=p; //p即是找到的当前结点,p不动,temp计算后缀串
while(temp!=root&&temp->count!=-) {
cnt+=temp->count;
temp->count=-;
temp=temp->fail;
}
}
printf("%d\n", cnt);
} int main()
{
int T,n;
char keyword[];
scanf("%d", &T);
while(T--) {
head=tail=;
scanf("%d", &n);
getchar();
root=new node();
while(n--) {
gets(keyword);
insert(keyword);
}
build_ac_automation();
gets(str);
query();
} return ;
}

HDU 2222  AC自动机模板题的更多相关文章

  1. HDU 2222 AC自动机模板题

    题目: http://acm.hdu.edu.cn/showproblem.php?pid=2222 AC自动机模板题 我现在对AC自动机的理解还一般,就贴一下我参考学习的两篇博客的链接: http: ...

  2. HDU 3065 (AC自动机模板题)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3065 题目大意:多个模式串,范围是大写字母.匹配串的字符范围是(0~127).问匹配串中含有哪几种模 ...

  3. HDU 2896 (AC自动机模板题)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2896 题目大意:多个模式串.多个匹配串.其中串的字符范围是(0~127).问匹配串中含有哪几个模式串 ...

  4. hdu 2222(AC自动机模版题)

    Keywords Search Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others ...

  5. HDU 2222 AC自动机 裸题

    题意: 问母串中出现多少个模式串 注意ac自动机的节点总数 #include <stdio.h> #include <string.h> #include <queue& ...

  6. HDU 2222 AC自动机模版题

    所学的AC自动机都源于斌哥和昀神的想法. 题意:求目标串中出现了几个模式串. 使用一个int型的end数组记录,查询一次. #include <cstdio> #include <c ...

  7. HDU 2222 & ac自动机模板

    题意: 求n个模板串在匹配串中出现了几个. SOL: 反正就是模板啦...似乎比KMP都简单----这么说似乎有点不道德...毕竟先看的KMP而他们并没有什么不同... 貌似自己的理解和他们画的图还是 ...

  8. HDU 2222 AC自动机(模版题)

    Keywords Search Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others ...

  9. Keywords Search HDU - 2222 AC自动机板子题

    In the modern time, Search engine came into the life of everybody like Google, Baidu, etc. Wiskey al ...

  10. HDU 2222(AC自动机模板题)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2222 题目大意:多个模式串.问匹配串中含有多少个模式串.注意模式串有重复,所以要累计重复结果. 解题 ...

随机推荐

  1. 【项目】百度搜索广告CTR预估

    -------倒叙查看本文. 6,用auc对测试的结果进行评估: auc代码如下: #!/usr/bin/env python import sys def auc(labels,predicted_ ...

  2. highcharts使用笔记

    1.legend取消点击事件: 饼图:plotOptions.pie.point.events.legendItemClick = function() {return false;} 其他,如:pl ...

  3. Mac 使用Sublime Text 3 搭建C开发环境

    Sublime Text 3  (安装包,注册码 ,汉化包) 1)工具-编译系统-新建编译器 { "cmd" : ["gcc -o ${file_base_name} $ ...

  4. nginx 反向代理 公用一个外网端口

    服务器:ubuntu 配置nginx代理有2个文件,分别是sites-enabled 和sites-available. 路径都在/etc/nginx下,sites-enabled为sites-ava ...

  5. SQL多表连接查询

    SQL多表连接查询 本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:student  截图如下: 表2:course  截图如下: (此时这样建表只是为了演示连接SQL语句,当然实际 ...

  6. CentOS7 Tomcat 环境部署

    java由jvm虚拟机和一些本地类库(与操作系统通信的底层库)和java类库组成.javase由jdk和一些基本api组成,而javaee则在javase基础上添加了一些企业常用的类库,其中两个著名a ...

  7. 使用ActionFilterAttribute进行重定向注意事项

    1.分部视图方法不能添加该特性,会报子方法不能重定向操作的错误 2.必须用给filterContext.Result赋值的方法进行重定向,而不能用filterContext.HttpContext.R ...

  8. NotePad++中如何出去闪烁的光标?

    当在写代码时出现的光标闪烁(横线闪烁),在键盘上找 Insert ,按这个Insert就可以把横向闪烁光标( _ )修改成竖向闪烁光标样式( | ),横向光标会在你写代码的时候修改前面的代码,把光标移 ...

  9. Dapper入门学习

    今天了解并学习了下Dapper的用法,这里简单介绍下 1.安装Nuget Dapper Package包 2.代码 using (IDbConnection connection = new SqlC ...

  10. WiX Toolset 教程索引页

    注意:虽然WiX Toolset功能强大,但其学习曲线相对较高.请慎重选择: 若没有足够时间.没心思搞的请绕行至inno setup.installshield.nisi.setupfactory.. ...