文本查找

发布时间: 2017年7月5日 00:10   最后更新: 2017年7月5日 13:47   时间限制: 1500ms   内存限制: 128M

描述

给定m种两两不同的关键词,并给定一段文本,问这段文本中有几种关键词出现(一种关键词出现多次只算一次)。

输入

多组输入数据。
每组数据第一行一个正整数m,表示有m个关键词。
接下来m行每行一个关键词,关键词仅包含小写字母。
最后一行为文本,仅包含小写字母。
每组数据保证关键词总长度不超过106,文本不超过106。
总字符输入量不超过107。

输出

对于每组数据,输出一行一个整数,表示答案。

样例输入1 复制

3
a
aa
b
aa

样例输出1

2

AC自动机的裸题,这里要说明的一点就是,一种关键词出现多次只能算一次,这样的话,我们就可以在一个关键词匹配完成后,在Trie树相关位置打上一个标记,防止下次重复计数。

代码:

#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int MAXN = 1e6+7;;
#define LETTER 26
struct Trie{int num, fail,match;int next[LETTER];
}pool[MAXN];
Trie* const trie = pool + 1;
int cnt;
void init(){cnt = 0;memset(pool, 0, 2 * sizeof(Trie));trie[0].fail = -1;
}
inline int convert(char c){return c - 'a';
}
void build()
{queue<int> q; q.push(0);while (!q.empty()){int t = q.front(); q.pop();for (int i = 0; i < LETTER; i++){int &cur = trie[t].next[i];if (cur){q.push(cur);trie[cur].fail = trie[trie[t].fail].next[i];trie[cur].match = trie[cur].num ? cur :trie[trie[cur].fail].match;}else cur = trie[trie[t].fail].next[i];}}
}
int search(char *s)
{int ret = 0, cur = 0;for (int i = 0; s[i]; i++){cur = trie[cur].next[convert(s[i])];for (int temp = trie[cur].match; temp;temp = trie[trie[temp].fail].match){ret += trie[temp].num;if(!trie[temp].num) break;trie[temp].num = 0;}}return ret;
}
void insert(char s[]){int cur = 0;for(int i = 0;s[i];i++){int &pos = trie[cur].next[convert(s[i])];if(!pos){pos = ++cnt;memset(&trie[cnt],0,sizeof(Trie));}cur = pos;}trie[cur].num ++;
}
char pat[MAXN];
char str[MAXN];
int main(){int m;while(~scanf("%d",&m)){init();while(m--){scanf(" %s",pat);insert(pat);}build();scanf(" %s",str);int ans = search(str);printf("%d\n",ans);}
}

2017西安交大ACM小学期 文本查找[AC自动机]相关推荐

  1. 2017西安交大ACM小学期 敏感词汇[AC自动机]

    敏感词汇 发布时间: 2017年7月5日 00:23   最后更新: 2017年7月6日 14:40   时间限制: 1500ms   内存限制: 128M 描述 我们知道,在进行聊天时,有些词汇是敏 ...

  2. 2017西安交大ACM小学期 选择困难症[折半枚举+二分查找]

    选择困难症 发布时间: 2017年7月4日 12:44   最后更新: 2017年7月4日 12:45   时间限制: 5000ms   内存限制: 128M 描述 GG有严重的选择困难症. 早上起床 ...

  3. 2017西安交大ACM小学期 刷墙[折半枚举+异或]

    刷墙 发布时间: 2017年7月3日 12:17   最后更新: 2017年7月6日 22:29   时间限制: 3000ms   内存限制: 128M 描述 小明有一面黑白混搭的墙,他想给把墙重新粉 ...

  4. 2017西安交大ACM小学期 刁钻的顾客[3进制+折半枚举]

    刁钻的顾客 发布时间: 2017年7月3日 10:23   时间限制: 3000ms   内存限制: 128M 描述 XJTU校园内新开一家商店,可是来了一位刁钻的顾客要购买商品A和商品B.关于商品的 ...

  5. 2017西安交大ACM小学期数论 [更新学号]

    发布时间: 2017年6月24日 20:27   最后更新: 2017年7月3日 09:27   时间限制: 3000ms   内存限制: 128M 描述 某知名高校有n个学生,每个学生有一个唯一ID ...

  6. 2017西安交大ACM小学期数论 [水题]

    水题 发布时间: 2017年6月25日 14:06   最后更新: 2017年7月3日 09:27   时间限制: 1000ms   内存限制: 128M 描述 平均因数个数的统计对于估算数论题目复杂 ...

  7. 2017西安交大ACM小学期 美妙音乐[差分KMP匹配]

    美妙音乐 发布时间: 2017年7月3日 13:14   最后更新: 2017年7月5日 13:47   时间限制: 500ms   内存限制: 128M 描述 一段音乐是由若干个音符组成的,音乐中的 ...

  8. 2017西安交大ACM小学期 有趣异或[Trie树]

    有趣异或 发布时间: 2017年7月4日 23:59   最后更新: 2017年7月5日 14:56   时间限制: 1500ms   内存限制: 512M 描述 给定n个非负整数,保证这些数两两不相 ...

  9. 2017西安交大ACM小学期 神器插座 KMP匹配

    神奇插座 发布时间: 2017年7月3日 11:27   最后更新: 2017年7月5日 13:46   时间限制: 500ms   内存限制: 128M 描述 AA所在的国家有一项神奇的发明:插座. ...

最新文章

  1. Java架构-薪水增长多少,新机会才值得考虑?
  2. Mysql优化之开山篇
  3. 安装 Windows 7 64位系统 相关注意事项
  4. Redis官网——如何利用Redis做服务器集群的分布式锁
  5. c++ 实现ping
  6. 您如何构造适合于numpy排序的数组?
  7. 关于SNS网站的数据统计分析
  8. Excel如何批量生成二维码
  9. 小米路由器mini刷lede_小米路由3刷LEDE/OpenWrt 固件
  10. Java基础系列:读取yml文件
  11. 各种比例尺图幅号计算excel表格
  12. 人生七年,耗时56年跟拍14个孩子,结局道尽人生残酷真相
  13. CSS生日快乐:CSS之父Håkon Wium Lie访谈录
  14. 2.3Linux中的日志管理
  15. 为什么一定要掌握自学能力?
  16. 【论文】GC-MC论文相关
  17. php将文本文件中的内容呈现到一个表格中
  18. 2021(接近2022)linux(ubuntu16.04)安装cuda跑深度学习步骤以及踩坑过程(ELF标头无效、导入torch后torch.cuda.is_available()为False等等)
  19. EAS(能量感知调度)绿色节能调度器
  20. JavaWeb框架设计之菜单设计

热门文章

  1. 调整png的不透明度_TGA与PNG的优劣对比
  2. Java当中捕获异常
  3. [数据结构-严蔚敏版]P46栈的顺序存储表示
  4. [Java基础]标准输入输出流
  5. [蓝桥杯2017初赛]方格分割-dfs+思维
  6. 2020牛客国庆集训派对day2 F题 Java大数处理
  7. maven mysql的jdbctemplate_JDBC、JDBCTemplate、MyBatis、Hiberante 比较与分析
  8. 数据结构与索引-- mysql InnoDB存储引擎索引
  9. word List29
  10. libjpeg: cannot open