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< ...
随机推荐
- 去重算法,简单粗暴&优化版
Remove Repeat 一.去重原理 1.进行排序 2.判断是否满足 '两个字符串相同' 的条件,相同则累加重复次数,并使用continue继续下一次循环 3.当条件不满足时,将该字符串和累计数加 ...
- jquery正确获取iframe里元素的方法
<iframe id="_ae_frame" width="100%" height="100%" frameborder=" ...
- omcat配置多域名站点启动时项目重复加载多次
在tomcat中配置多个Host的时候, 出现项目重复启动多次的情况. 刚开始以为是spring boot发布项目的时候自带了一个tomcat引起的, 后来发现不是 参考了这两篇文章, 解决问题 ht ...
- Mssql 查询某记录前后N条
Sqlserver 查询指定记录前后N条,包括当前数据 条件 [ID] 查询 [N]条 select * from [Table] where ID in (select top ([N]+1) ID ...
- Cef 因系统时间不正常,导致页面访问空白问题
当我们的系统时间不正常,比如设置一个日期-1999年9月9日,会引发证书问题. 系统时间不正常-IE有概率能访问 触发NavigateError事件,异常代码INET_E_INVALID_CERTIF ...
- Arduino 基于 ESP8266 配置WIFI模块
Arduino 基于 ESP8266 配置WIFI模块 使用ESP8266作为服务器,使用浏览器访问该服务器,从而控制LED灯 选择 [文件]->[示例]->[ESP8266WIFI]-& ...
- hdu 2554 最短路 (dijkstra)
最短路Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...
- UCACO刷题
UCACO刷题 SUBMIT: /* ID: your_id_here LANG: C++ TASK: test */ 文件:freopen(“file.in", "r" ...
- [转]shell 特殊字符
下面这篇博文对特殊字符总结的非常齐全.这里做一下mark.另外补充一些例子. https://blog.csdn.net/K346K346/article/details/51819236 假设我们定 ...
- node中mysql和短信使用方法(3)
一.mysql的使用 使用mysql首先得有数据库并且表里面有数据,我创建了数据库newsql,里面Tables有表company等等. company有id,name,other等字段 1.导入my ...