点此看题面
大致题意: 给你一个文本串和NNN个模式串,要你将每一个模式串从文本串中删去。(此题是【bzoj3942】[Usaco2015 Feb]Censoring的升级版)


ACACAC自动机

这是一道ACACAC自动机的简单运用题。

LinkLinkLink

ACACAC自动机详见博客初学AC自动机


题解

我们可以用一个ans[ans[ans[ ]]]字符数组来存储最后的答案,并用一个lst[lst[lst[ ]]]数组来记录字符串中每一位上次被访问时所到达的TrieTrieTrie上的节点。

如果找到了一个长度为lenlenlen的模式串要删去,我们可以将ansansans的长度lenanslen_{ans}lenans​减去lenlenlen,然后更新当前在TrieTrieTrie上访问到的节点为lst[lenans]lst[len_{ans}]lst[lenans​]。

这样不断操作,就可以求出答案了。


代码

#include<bits/stdc++.h>
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y))
#define LL long long
#define ull unsigned long long
#define swap(x,y) (x^=y,y^=x,x^=y)
#define tc() (A==B&&(B=(A=ff)+fread(ff,1,100000,stdin),A==B)?EOF:*A++)
#define SUM 100000
char ff[100000],*A=ff,*B=ff;
using namespace std;
int n,rt=1,tot=1,lst[SUM+5];
string st;
char ans[SUM+5];
struct Trie
{int Son[26],Next,Len;
}node[SUM+5];
queue<int> q;
inline void read(int &x)
{x=0;static char ch;while(!isdigit(ch=tc()));while(x=(x<<3)+(x<<1)+ch-48,isdigit(ch=tc()));
}
inline void read_string(string &x)
{x="";static char ch;while(isspace(ch=tc()));while(x+=ch,!isspace(ch=tc())) if(!(~ch)) return;
}
inline void Insert(string st)
{register int i,nxt,x=rt,len=st.length();for(i=0;i<len;++i){if(!node[x].Son[nxt=st[i]-97]) node[x].Son[nxt]=++tot;x=node[x].Son[nxt];}node[x].Len=len;//在当前模式串最后到达的节点记录下当前模式串的长度
}
inline void GetNext()
{register int i,k;q.push(rt);while(!q.empty()){k=q.front(),q.pop();for(i=0;i<26;++i){if(k^rt){if(!node[k].Son[i]) node[k].Son[i]=node[node[k].Next].Son[i];else node[node[k].Son[i]].Next=node[node[k].Next].Son[i],q.push(node[k].Son[i]);}else{if(!node[k].Son[i]) node[k].Son[i]=rt;else node[node[k].Son[i]].Next=rt,q.push(node[k].Son[i]);}}}
}
inline void AC_Automation()
{register int i,j,x=rt,len=st.length(),len_ans=0;for(GetNext(),i=0;i<len;++i){if(!(x=node[x].Son[(ans[++len_ans]=st[i])-97])) {lst[len_ans]=x=rt;continue;}lst[len_ans]=x;//用lst[]数组存储下当前位置所对应的Trie上的节点if(node[x].Len) len_ans-=node[x].Len,x=lst[len_ans];//如果当前位置上有一个字符串,就将其删去,并更新当前Trie上的节点}ans[len_ans+1]=0;
}
int main()
{register int i,j;register string s;for(read_string(st),read(n),i=1;i<=n;++i) read_string(s),Insert(s);return AC_Automation(),puts(ans+1),0;
}

【BZOJ3940】[USACO2015 Feb] Censoring (AC自动机的小应用)相关推荐

  1. bzoj3940 [Usaco2015 Feb]Censoring(ACAM+栈)

    题目大意:给定文本串S,n个模式串.要求从S中依次删去出现的模式串. 建出ACAM,直接用栈来模拟即可. #include <cstdio> #include <cstring> ...

  2. 【BZOJ4327】[JSOI2012] 玄武密码(AC自动机的小应用)

    点此看题面 大致题意: 给你一个长度为lenlenlen的文本串和nnn个模式串,让你求出每一个模式串的前缀与文本串的最大匹配串长度(其中模式串和文本串都只由字符'E','S','W','N'组成). ...

  3. 【BZOJ3172】[TJOI2013] 单词(AC自动机的小应用)

    点此看题面 大致题意: 给你NNN个单词,请你求出每一个单词在这NNN个单词中出现的次数. 相关题目 这道题应该是洛谷上一道板子题的升级版. LinkLinkLink [洛谷3796][模板]AC自动 ...

  4. [BZOJ 3942] [Usaco2015 Feb] Censoring 【KMP】

    题目链接:BZOJ - 3942 题目分析 我们发现,删掉一段 T 之后,被删除的部分前面的一段可能和后面的一段连接起来出现新的 T . 所以我们删掉一段 T 之后应该接着被删除的位置之前的继续向后匹 ...

  5. 提高篇 第二部分 字符串算法 第4章 AC自动机

    https://blog.csdn.net/wangyh1008/article/details/81428056 [模板]AC自动机(加强版) 洛谷3796 AC自动机_A_loud_name-CS ...

  6. 【HDU 4511】小明系列故事——女友的考验(AC自动机+DP)

    Problem Description 终于放寒假了,小明要和女朋友一起去看电影.这天,女朋友想给小明一个考验,在小明正准备出发的时候,女朋友告诉他,她在电影院等他,小明过来的路线必须满足给定的规则: ...

  7. HDU - 4511 小明系列故事——女友的考验(AC自动机+dp)

    题目链接:点击查看 题目大意:小明在点 1 而小明的女朋友在点 n ,现在小明要去找女朋友,满足以下两个条件: 途径的序号满足严格递增 小明的女朋友给小明提出了 m 条路径是不允许走的 在满足上述两条 ...

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

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

  9. ac自动机(模板+一点点小优化)

    题意:给定n个模式串和1个文本串,求有多少个模式串在文本串里出现过. 题解:ac自动机+加一点点优化,否则过不了,具体见代码,就一行代码. 传送门 #include<iostream> # ...

最新文章

  1. 山东省各2021高考成绩查询,关于2021年山东省高考成绩查询系统入口【官网】
  2. 【错误记录】Android Studio 配置 AspectJ 报错 ( all buildscript {} blocks must appear before any plugins {} )
  3. c语言是结构化 模块化,c语言是完全模块化和结构化的语言,怎么理解,什么是模块化和结构化...
  4. linux 文件系统 vfs,linux虚拟文件系统vfs
  5. 编程doc转html,Python批量将word转html,并将html内容发布至网站。
  6. 冯诺依曼计算机的组成
  7. iPhone 14系列贴膜曝光:将采用开孔屏方案 四边框极窄
  8. centos 修改密码_centos7忘记root密码怎么改
  9. java加载publickey,比较java中的PublicKey对象
  10. 盘点2017年热度很高的编程语言
  11. idea打包Jar包
  12. 接口自动化测试实践指导(上):接口自动化需要做哪些准备工作
  13. 数据结构与算法系列 目录(摘抄自“skywang12345”)
  14. 只利用 phpstudy 如何运行PHP文件 超详细教程
  15. 修炼一名程序员的职业水准(林庆忠__署名原创)
  16. 用小鸟云服务器搭建网站常用的伪静态设置规则
  17. Al-learing数学基础,平均差,方差,协方差
  18. 系统扫描修复cmd命令
  19. Cocos之 从C++过渡到Lua
  20. 搜狗2019年Q2财报:搜索业务增速领先行业,AI成为新增长引擎

热门文章

  1. Android KeyCode列表 input keyevent XXX
  2. PHP 开发社区微信服务号实战图解
  3. 【转】实现远程开机(电脑)的各种方法总结
  4. 程序编辑,程序编译,程序连接。
  5. 在win10查看本机linux的文件,Windows 10变身开发者利器:内置Linux内核,轻松查看Linux子系统文件...
  6. Java 如何查询当前项目Spring和SpringBoot的版本号
  7. 脏读、幻读、不可重复读,傻傻分不清楚
  8. 草料二维码--在线二维码生成器
  9. 数据标准化与PCA白化原理探索
  10. Android 11 Bata 正式发布!闲鱼最新升级版 Flutter 技术电子书开放下载