UESTC1977-图书馆(AC自动机应用)
M - 图书馆
Time Limit: 2000 MS Memory Limit: 256 MB
电子科技太学图书馆创建于1956年,馆舍总面积66974平方米,各类阅览室37个,阅览座位10023个(含在建新馆),馆藏总量371.8万册。
为了更好地管理数量如此庞大的书籍,管理员准备对所有书籍进行一次统计、整理。图书管理员需要将相似的图书归为一类,为此它为每个分类选出了几个关键词,如果在一本书的文本中,关键词出现得越频繁,则说明这本书越有可能属于这一类。
现在,管理员把这项重任交给你,并希望在太阳完全下山之前能够统计出每个关键词在书本中出现次数的总和。
注:重复关键词重复统计。
Input
输入文件中第一行一个正整数 TT 表示测试数据组数。
每组测试数据第一行为书籍内容,为长度不大于 1000000 的字符串 SS。
第二行为不多于 10000 的整数 NN ,表示关键词个数,接下去 NN 行,每行有长度不超过 50 的关键词字符串。
数据保证字符串只由英文小写字母 a-z 组成,不存在空串。 T×|S|≤10000000T×|S|≤10000000
Output
每组测试数据输出一行,为每个关键词在书本中出现次数的总和。
Sample input and output
| Sample Input | Sample Output |
|---|---|
1 |
3 |
Hint
trumpet 中出现了 trump pet rump 。
AC自动机模版题:
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#define MAXNODE 500005
using namespace std;
int n,T;
char str[1000005],s[100];
struct ACautomata
{
int ch[MAXNODE][26];
int f[MAXNODE]; // fail函数
int val[MAXNODE]; // 是否为单词结尾
int last[MAXNODE]; // 后缀链接
int cnt[10005]; // 每个单词出现次数
int tot; // trie 单词总数
int num; // 单词出现了几个
int time[10005]; //以val[i]结尾的单词数量
void init()
{
num = 0;
tot = 1;
memset(ch[0],0,sizeof(ch[0]));
memset(cnt,0,sizeof(cnt));
memset(time,0,sizeof(time));
}
int idx(char c) //获取编号
{
return c - 'a';
}
void insert(char *s,int v) //插入
{
int u = 0,n = strlen(s);
for(int i = 0;i < n;i++)
{
int c = idx(s[i]);
if(!ch[u][c])
{
memset(ch[tot],0,sizeof(ch[tot]));
val[tot] = 0;
ch[u][c] = tot++;
}
u = ch[u][c];
}
if(val[u]) time[val[u]]++;
else val[u] = v,time[v] = 1;
}
void print(int j)
{
if(j)
{
//if(!cnt[val[j]])
num += time[val[j]];
cnt[val[j]]++;
print(last[j]);
}
}
void find(char *T)
{
int n = strlen(T);
int j = 0;
for(int i = 0;i < n;i++)
{
int c = idx(T[i]);
j = ch[j][c];
if(val[j]) print(j);
else if(last[j]) print(last[j]);
}
}
void getFail()
{
queue<int> q;
f[0] = 0;
for(int c = 0;c < 26;c++)
{
int u = ch[0][c];
if(u)
{
f[u] = 0;
q.push(u);
last[u] = 0;
}
}
while(!q.empty())
{
int r = q.front();
q.pop();
for(int c = 0;c < 26;c++)
{
int u = ch[r][c];
if(!u)
{
ch[r][c] = ch[f[r]][c];
continue;
}
q.push(u);
f[u] = ch[f[r]][c];
last[u] = val[f[u]] ? f[u] : last[f[u]];
}
}
}
} tree;
int main()
{
cin>>T;
while(T--)
{
tree.init();
scanf("%s",str);
cin>>n;
for(int i = 1;i <= n;i++)
{
scanf("%s",s);
tree.insert(s,i);
}
tree.getFail();
tree.find(str);
cout<<tree.num<<endl;
}
return 0;
}
UESTC1977-图书馆(AC自动机应用)的更多相关文章
- 一个在开源中国博客上讲解的AC自动机
原文出处:http://my.oschina.net/amince/blog/196426 原 荐 AC(Aho—Corasiek) 多模式匹配算法 摘要 如何在一篇文章中,搜索多个关键字,如何快速查 ...
- 基于trie树做一个ac自动机
基于trie树做一个ac自动机 #!/usr/bin/python # -*- coding: utf-8 -*- class Node: def __init__(self): self.value ...
- AC自动机-算法详解
What's Aho-Corasick automaton? 一种多模式串匹配算法,该算法在1975年产生于贝尔实验室,是著名的多模式匹配算法之一. 简单的说,KMP用来在一篇文章中匹配一个模式串:但 ...
- python爬虫学习(11) —— 也写个AC自动机
0. 写在前面 本文记录了一个AC自动机的诞生! 之前看过有人用C++写过AC自动机,也有用C#写的,还有一个用nodejs写的.. C# 逆袭--自制日刷千题的AC自动机攻克HDU OJ HDU 自 ...
- BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]
2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2545 Solved: 1419[Submit][Sta ...
- BZOJ 3172: [Tjoi2013]单词 [AC自动机 Fail树]
3172: [Tjoi2013]单词 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 3198 Solved: 1532[Submit][Status ...
- BZOJ 1212: [HNOI2004]L语言 [AC自动机 DP]
1212: [HNOI2004]L语言 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1367 Solved: 598[Submit][Status ...
- [AC自动机]【学习笔记】
Keywords Search Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)To ...
- AC自动机 HDU 3065
大概就是裸的AC自动机了 #include<stdio.h> #include<algorithm> #include<string.h> #include< ...
随机推荐
- PHP Laravel 中使用简单的方法跟踪用户是否在线
今天,我的任务是,在 Laravel 应用程序用户个人资料页面上,用户名旁边添加一个绿点,表示他们是否在线.我首先想到的是,我们将需要启动一个 node.js 服务器并跟踪每个用户的活动套接字连接.然 ...
- nyoj 311-完全背包 (动态规划, 完全背包)
311-完全背包 内存限制:64MB 时间限制:4000ms Special Judge: No accepted:5 submit:7 题目描述: 直接说题意,完全背包定义有N种物品和一个容量为V的 ...
- Linux进程管理(ps、pstree、top、pidof、kill、nice、free)
进程号(Process ID,PID) 1.ps命令(process status) 无选项时只显示从当前终端当前用户的进程 ps aux 是用BSD的格式来显示 java这个进程显示的项目有:USE ...
- Mac安装和卸载Mysql
目录 一.安装 二.环境变量 2.1 MySQL服务的启停和状态的查看 三.启动 四.初始化设置 4.1 退出sql界面 五.配置 5.1 检测修改结果 一.安装 第一步:打开网址,https://w ...
- 万恶之源-与python的初识
1.计算机基础知识 1.cpu: 人类的大脑 运算和处理问题 2.内存: 临时存储数据 断电就消失了 3.硬盘: 永久 存储数据 4.操作系统:是一个软件 控制每个硬件之间数据交互 2 ...
- Golang 指针理解
目录 0x00 指针地址和指针类型 0x01 从指针获取指针指向的值 0x02 使用指针修改值 0x03 返回函数中局部变量 0x04 使用 new() 创建指针 0x05 flag包的指针技术 0x ...
- day 26 约束、自定义异常、加密hashlib、logging
一.约束 建议使用: class BaseMessage(object): def send(self): """ 必须继承BaseMessage,然后其中必须编写sen ...
- LeetCode 5276. 不浪费原料的汉堡制作方案 Number of Burgers with No Waste of Ingredients
地址 https://leetcode-cn.com/problems/number-of-burgers-with-no-waste-of-ingredients/ 目描述圣诞活动预热开始啦,汉堡店 ...
- Java基础面试题及答案(二)
容器 18. java 容器都有哪些? 常用容器的图录: 19. Collection 和 Collections 有什么区别? java.util.Collection 是一个集合接口(集合类的一个 ...
- 删除节点(removeChild())
remoceChild():方法将从一个给定元素里删除一个子节点: reference = element.removeChild(node); 这个方法的返回值是一个指向已经被删除的子节点的引用指针 ...