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< ...
随机推荐
- linux-mysql8的安装步骤详解及需要注意的坑
(本文由言念小文原创,转载请注明出处) 前言 最近安装mysql8时,遇到了一些问题,记录下来作为以后操作指导资料. Linux上mysql安装方法个人目前使用的有两种: 一种是基于rpm安装: 另一 ...
- Linux下编写-makefile-详细教程(跟我一起写-Makefile-Markdown整理版)
目录 概述 关于程序的编译和链接 Makefile 介绍 Makefile的规则 一个演示例子 make是怎样工作的 makefile中使用变量 让make自己主动推导 另类风格的makefile 清 ...
- 删除TFS上的团队项目
Visual Studio 提供了一个工具 在X:\X\Microsoft Visual Studio X\Common7\IDE Visual Studio安装路径 下 TFSDeletepr ...
- SecureCRT 多个会话显示在同一窗口
- centos 更换用户密码
腾讯云报告了我的服务器被暴力破解了.... 因此需要更换更复杂的password, 命令为:passwd 用户名,例如下我要更换root的password [root@VM_0_4_centos ~ ...
- windows 10 上源码编译opengv | compile opengv on windows 10 from source
本文首发于个人博客https://kezunlin.me/post/51cd9fa0/,欢迎阅读! compile opengv on windows 10 from source Series co ...
- MyBatis 数值类型 where 条件配置的坑
复现异常 我们先通过案例复现该类异常,测试项目地址:https://gitee.com/yin_jw/demo/tree/master/mybatis-demo/springboot-mybatis- ...
- 多线程之美3一Java并发工具类
一.简介 1.1. Semaphore 信号量,见文知义,常用于并发控制中的限流作用,我理解是限定数量的共享锁机制.该共享资源最多同时可让n个线程访问,超过n个线程就阻塞等待,如有资源空闲, 唤醒其他 ...
- Fortran文件读写--查找内容
program ex implicit none character(len=) A(),B(),C() !A异常.B已开挖.C需标记 integer i,j,N1,N2,count !N1是10号文 ...
- [ch03-02] 交叉熵损失函数
系列博客,原文在笔者所维护的github上:https://aka.ms/beginnerAI, 点击star加星不要吝啬,星越多笔者越努力. 3.2 交叉熵损失函数 交叉熵(Cross Entrop ...