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. SDN/NFV运营商商业化部署

    三大运营商发布未来网络架构,并逐步加快SDN/NFV商业化部署的步伐.中国联通发布其新一代网络架构<CUBE-Net 2.0白皮书>,并与20多家合作伙伴共同启动了“新一代网络”合作研发计 ...

  2. Java中关于String类型的10个问题

    1. 如何比较两个字符串?用“=”还是equals 简单来说,“==”是用来检测俩引用是不是指向内存中的同一个对象,而equals()方法则检测的是两个对象的值是否相等.只要你想检测俩字符串是不是相等 ...

  3. nodejs中npm常用命令

    npm install <name>安装nodejs的依赖包 例如npm install express 就会默认安装express的最新版本,也可以通过在后面加版本号的方式安装指定版本, ...

  4. 将jetty嵌入到应用中的简单案例

    前面说过jetty最广泛的应用是可以方便的嵌入到应用程序中,而不是作为应用服务器,下面就用最简单的demo来演示一个最简单的应用 1.下载并导入依赖 首先应该建立一个普通的java项目,然后把依赖包导 ...

  5. printf和scanf

    一 printf和scanf(printf和scanf是c语言中的输入输出库函数) printf(”格式控制“,输出列表) <1>格式控制 其中包含 格式声明(%+相应格式对应字母).转义 ...

  6. LeetCode 167 Two Sum II - Input array is sorted

    Problem: Given an array of integers that is already sorted in ascending order, find two numbers such ...

  7. List提取相同元素

    List<int> currentList = Cls_Data.SoruceDataIntses[key]; preList = currentList.Intersect(preLis ...

  8. Linux下的DOS攻击

    Linux下的DOS攻击 DOS是Denial of service的简称,即拒绝服务,造成Dos攻击行为被称为Dos攻击,其目的是使计算机或网络无法提供正常的服务.最常见的Dos攻击有计算机带宽攻击 ...

  9. microsoft office professional plus2013激活

    激活工具一般使用KMS8,KMS8不支持零售版的激活, 而office professional plus2013零售版,需要先转化为VOL版 需要以下两步: 1.将word转化为vol版 链接: h ...

  10. 获取QQ缓存图片