敏感词汇

发布时间: 2017年7月5日 00:23   最后更新: 2017年7月6日 14:40   时间限制: 1500ms   内存限制: 128M

描述

我们知道,在进行聊天时,有些词汇是敏感词汇,含有敏感词汇的内容是不允许被发送的。现在给定m个敏感词汇,并给定一段文本,请将所有敏感词汇都用星号替换掉。

输入

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

输出

对每组数据,输出一行一个字符串,表示敏感词汇都用星号替换掉后的文本。

样例输入1 复制

3
naive
simple
glasses
glassesimplenaiveexcited

样例输出1

*****************excited

这是一个比较裸的AC自动机的题

这里要注意几点:

1.不能边检测边覆盖,不然肯定会超时,所以我们用一个replace数组记录下从当前这个位置应该向前覆盖*的个数

2.在检测到下一个字符,并且往前回溯的时候,只要搜索到第一个有效模式即可,因为剩下的模式长度只能更小,我们覆盖大模式的时候,肯定就可以覆盖掉小的模式

3.最后覆盖的时候,从后往前扫描replace数组,可以在O(n)时间内完成覆盖

代码:

#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int MAXN = 1e6+7;
int replace[MAXN];
#define LETTER 26
struct Trie{int num, fail,match;int next[LETTER];int dep;
}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){replace[i] = trie[temp].dep;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));}trie[pos].dep = trie[cur].dep + 1;cur = pos;}trie[cur].num ++;
}char pat[MAXN];
char str[MAXN];
int main(){int m;while(~scanf("%d",&m)){init();memset(replace,0,sizeof(replace));while(m--){scanf(" %s",pat);insert(pat);}build();scanf(" %s",str);int ans = search(str);//printf("%d\n",ans);int len = strlen(str);int cnt = 0;for(int i = len-1;i >= 0;i--){cnt = max(cnt,replace[i]);if(cnt){str[i] = '*';cnt--;}}puts(str);}
}

2017西安交大ACM小学期 敏感词汇[AC自动机]相关推荐

  1. 2017西安交大ACM小学期 文本查找[AC自动机]

    文本查找 发布时间: 2017年7月5日 00:10   最后更新: 2017年7月5日 13:47   时间限制: 1500ms   内存限制: 128M 描述 给定m种两两不同的关键词,并给定一段 ...

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

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

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

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

  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. 作业盒子完成1.5亿美元D轮融资,用AI普及教育资源
  2. python编程小学生学好吗-小学生都开始学的Python编程到底是什么?
  3. Spring Cloud Stream 使用延迟消息实现定时任务(RabbitMQ)
  4. Example3_3(if-else语句)
  5. 解决MySQL不允许从远程访问的方法
  6. 维拉智能管家机器人_“女性机器人”广受欢迎,但却面临3大问题,男性坦言:不敢用...
  7. 统计学基础学习笔记:描述统计量
  8. linux下的常用时间函数总结
  9. SpringBoot 2.1.5(36)---整合Mybatis
  10. itextpdf将带复选框的html_HTML基础知识
  11. ASP.NET Razor 视图引擎编程参考
  12. Jzoj4831 方程式
  13. 二分法实现SQL盲注
  14. 【逗老师带你学IT】PRTG、Zabbix通过API监控深信服VDC和VMP云桌面运行状态
  15. java api 合数_如何在 Swift 语言下使用 iOS Charts API 制作漂亮图表?
  16. Python爬取B站柯南弹幕+Gephi梳理主线剧情
  17. (附源码)springboot教材订购系统的开发毕业设计081419
  18. Mathematica绘制动态椭圆摆线(一)
  19. MapReduce打包jar包并运行的步骤操作以及重要的注意事项
  20. Java和go加密,解密,Base64失败

热门文章

  1. python中x_python中round(x,[n])的使用
  2. Android开发p图软件,媲美大神P图效果 Android软件抠图神手
  3. 软件构造学习笔记-实验3
  4. 7-9 删数问题 (10 分)(思路加详解)
  5. C++ 学习之旅(4)——调试Debug
  6. 创新视角下的复盘 | 2021/08/01-2021/09/30
  7. [Java基础]权限修饰符
  8. Facade(外观)--对象结构型模式
  9. 2018 蓝桥杯省赛 B 组模拟赛(一) 封印之门+最短路径之Floyd
  10. c语言程序设计7.4思考题答案,C语言程序设计习题集及答案(7)