CENSORING

题目描述

FJ为它的奶牛订阅了很多杂志,balabala.......,其中有一些奶牛不宜的东西(比如如何煮牛排)。

FJ将杂志中所有的文章提取出来组成一个长度最多为10^5的字符串S。他有一个要从S中删除的词语的列表,t1,t2...tn。

FJ每次找到最早的出现在列表里的子串,然后将其删去。他重复此过程,直到找不到这样的子串。值得注意的是删除一个单词可能产生一个新的之前并没有出现过的要被删除的单词。

FJ保证列表中没有一个字符串是另一个字符串的子串。要就是说每次要删的单词是唯一确定的。

帮助FJ确定最终S的删减版。

Solution
考虑把T建成AC自动机。把S扔进去匹配,,用栈记录每一步的位置,遇到可匹配点就往后跳到匹配该串前的位置。

 #include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define maxn 300050
using namespace std;
int n,len,tot,top;
int tr[maxn][],fail[maxn],p[maxn];
char s[maxn],ch[maxn];
int zh[maxn];char ans[maxn];
void ins(){
int len=strlen(ch),k=;
for(int i=;i<len;i++){
if(!tr[k][ch[i]-'a'])tr[k][ch[i]-'a']=++tot;
k=tr[k][ch[i]-'a'];
}
p[k]=len;
}
void build(){
queue<int>q;
for(int i=;i<;i++)if(tr[][i])q.push(tr[][i]);
while(!q.empty()){
int k=q.front();q.pop();
for(int i=;i<;i++){
if(tr[k][i]){
fail[tr[k][i]]=tr[fail[k]][i];
q.push(tr[k][i]);
}
else tr[k][i]=tr[fail[k]][i];
}
}
}
int main()
{
scanf("%s",s);
cin>>n;
for(int i=;i<=n;i++){
scanf("%s",ch);
ins();
}
build();
n=strlen(s);int k=;
for(int i=;i<n;i++){
k=tr[k][s[i]-'a'];
zh[++top]=k;ans[top]=s[i];
if(p[k]){
top-=p[k];k=zh[top];
}
}
for(int i=;i<=top;i++)printf("%c",ans[i]);
return ;
}

最新文章

  1. 【读书】PHP程序员要读的书目(不断完善中)
  2. codefordream 关于js初级训练
  3. [软件测试基础3]基于Jemter的压力测试
  4. web端视频直播网站的弊端和优势
  5. JNI c++ 调用 java
  6. Delphi XE5 for android 调用Java类库必看的文件
  7. Java-马士兵设计模式学习笔记-责任链模式-模拟处理Reques Response
  8. iOS 画图讲解2
  9. activity的测试工程activiti-explorer使用
  10. c++里的类型转化
  11. OUI-67076 : OracleHomeInventory was not able to create a lock file&amp;quot; in Unix
  12. 什么是DCI
  13. LINUX 笔记-文本过滤
  14. 一行命令更新所有 npm 依赖包
  15. C#--深入理解类型
  16. zList一个块状链表算法可以申请和释放同种对象指针,对于大数据量比直接new少需要差不多一半内存
  17. 建立Heapster Influxdb Grafana集群性能监控平台
  18. zabbix3.0.4添加对指定进程的监控
  19. 安装多个java后,java版本不对
  20. Android-Java-面向对象的代码例子

热门文章

  1. SHOPEX快递单号查询插件圆通V8.2专版
  2. laravel -- 路由
  3. python2.7练习小例子(二十八)
  4. node 发送 post 请求 get请求。
  5. MD5、SHA校验命令
  6. 自动化测试--testNG
  7. 深入Python的类和对象
  8. Java并发基础--线程安全
  9. (原创)不过如此的 DFS 深度优先遍历
  10. 文件名的查找——find