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. Eclipse 各版本版本号代号对应一览表

    版本号 代号 日期   Eclipse 3.1 IO [木卫一,伊奥] 2005   Eclipse 3.2 Callisto [木卫四,卡里斯托] 2006   Eclipse 3.3 Eruopa ...

  2. django 强制登录最佳实践

    参考: https://python-programming.courses/recipes/django-require-authentication-pages/ 即通过中间件来做AOP拦截.不用 ...

  3. Springboot快速入门创建

    maven构建项目 1.访问http://start.spring.io/,进入快速创建工程的主页 可参考下图所示: 2.选择构建工具Maven Project.Spring Boot版本1.3.6以 ...

  4. ORA-01502: index 'INDEX_NAME' or partition of such index is in unusable state

    ORA-01502: index 'INDEX_NAME' or partition of such index is in unusable state 原因: 这个错误一般是因为索引状态为UNUS ...

  5. ABAP 常见查询问题解决方法

    在ABAP 编程的时候会遇到查询单条语句的时候数能取对  但是条目数多了的话 会出现数不准确的问题   原因可能出现在查询使用了二分法查询方式  二分法查询下必须按排序的字段排序  还得按照排序的字段 ...

  6. ACID属性区别

    事务是指对系统进行的一组操作,为了保证系统的完整性,事务需要具有ACID特性,具体如下: 1. 原子性(Atomic)     一个事务包含多个操作,这些操作要么全部执行,要么全都不执行.实现事务的原 ...

  7. display:none与visible:hidden的区别 slideDown与

    display:none与visible:hidden的区别 display:none和visible:hidden都能把网页上某个元素隐藏起来,但两者有区别: display:none ---不为被 ...

  8. PostgreSQL 允许远程访问设置方法

     安装PostgreSQL数据库之后,默认是只接受本地访问连接.如果想在其他主机上访问PostgreSQL数据库服务器,就需要进行相应的配置. 配置远程连接PostgreSQL数据库的步骤很简单,只需 ...

  9. OpenGL glMultMatrixf() glPushMatrix() glPushMatrix()浅析

    我在之前的博客中曾提到过,OpenGL中坐标是采用行向量表示的,与之相对应的是,在矩阵变换中使用的是变换矩阵的转置,并且使用的是后乘的方式.本文直接使用下面的代码来及其后的图示来解释函数 p,li { ...

  10. extarea输入的换行在网页上正常显示

    如图