吐槽

数据太水了吧,我AC自动机的trie建错了结果只是RE了两个点,还以为数组开小了改了好久

思路

看到多模板串,字符串匹配,且模板串总长度不长,就想到AC自动机

然后用栈维护当前的字符串位置,如果匹配到了,就从栈里逐个弹出对应的字符,并且回溯到匹配这个单词之前的节点

s每个字符最多会被出栈和入栈各两次,复杂度是\(O(n+m)\)的

代码

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <algorithm>
#include <queue>
#include <stack>
using namespace std;
int trie[410000][26],Nodecnt=0,fail[410000],mark[410000],root,len[410000],n;
char s[410000],t[410000];
void insert(char *s,int len,int cnt){
int o=root;
for(int i=1;i<=len;i++){
if(!trie[o][s[i]-'a'])
trie[o][s[i]-'a']=++Nodecnt;
o=trie[o][s[i]-'a'];
}
mark[o]=cnt;
}
void build_AC(void){
queue<int> q;
for(int i=0;i<26;i++){
if(trie[root][i]){
fail[trie[root][i]]=root;
q.push(trie[root][i]);
}
}
while(!q.empty()){
int x=q.front();
q.pop();
for(int i=0;i<26;i++){
if(trie[x][i]){
fail[trie[x][i]]=trie[fail[x]][i];
q.push(trie[x][i]);
}
else{
trie[x][i]=trie[fail[x]][i];
}
}
}
}
struct SNode{
int num;
char c;
};
stack<char> S2;
stack<SNode> S1;
void query(void){
int o=root;
int mid=0;
while(S2.size()){
// printf("%d %d\n",++mid,S1.size());
char c=S2.top();
S2.pop();
o=trie[o][c-'a'];
if(!mark[o])
S1.push((SNode){o,c});
else{
// printf("begin\n");
int p=o;
for(int i=1;i<=len[mark[p]];i++){
if(S1.size())
o=S1.top().num;
else{
o=root;
break;
}
if((!S1.empty())&&i<len[mark[p]])
S1.pop();
else if(i<len[mark[p]]){
o=root;
break;
}
}
}
}
}
void print(void){
char c=S1.top().c;
S1.pop();
if(!S1.empty())
print();
putchar(c);
}
int main(){
// freopen("testdata (5).in","r",stdin);
// freopen("test.out","w",stdout);
scanf("%s",s+1);
int lens=strlen(s+1);
// printf("lens=%d\n",lens);
// _sleep(1000);
for(int i=lens;i>=1;i--)
S2.push(s[i]);
// int g=1;
// for(;g<=lens;g++)
// if(s[g]!='a')
// break;
// printf("sa=%d\n",g-1);
// _sleep(1000);
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%s",t+1);
len[i]=strlen(t+1);
// printf("len[%d]=%d\n",i,len[i]);
// _sleep(1000);
insert(t,len[i],i);
}
build_AC();
query();
// printf("ok\n");
print();
printf("\n");
return 0;
}

P3121 [USACO15FEB]审查(黄金)Censoring (Gold)的更多相关文章

  1. 洛谷P3121 审查(黄金)Censoring(Gold) [USACO15FEB] AC自动机

    正解:AC自动机 解题报告: 传送门! 啊我好呆啊其实就挺模板题的,,,只是要一个栈搞一下,,,然后我就不会了,,,是看了题解才get的,,,QAQ 然后写下解法趴QwQ 首先看到多串匹配不难想到AC ...

  2. P4824 [USACO15FEB]Censoring (Silver) 审查(银)&&P3121 [USACO15FEB]审查(黄金)Censoring (Gold)

    P3121 [USACO15FEB]审查(黄金)Censoring (Gold) (银的正解是KMP) AC自动机+栈 多字符串匹配--->AC自动机 删除单词的特性--->栈 所以我们先 ...

  3. P3121 [USACO15FEB]审查(AC自动机)

    题目: P3121 [USACO15FEB]审查(黄金)Censoring (Gold) 解析: 多字符串匹配,首先想到AC自动机 建立一个AC自动机 因为有删除和拼接这种操作,考虑用栈维护 顺着文本 ...

  4. 洛谷 P3121 [USACO15FEB]审查(黄金)Censoring (Gold) 【AC自动机+栈】

    这个和bzoj同名题不一样,有多个匹配串 但是思路是一样的,写个AC自动机,同样是开两个栈,一个存字符,一个存当前点在trie树上的位置,然后如果到了某个匹配串的末尾,则弹栈 #include< ...

  5. 「USACO15FEB」「LuoguP3121」审查(黄金)Censoring (Gold)(AC自动机

    题目描述 Farmer John has purchased a subscription to Good Hooveskeeping magazine for his cows, so they h ...

  6. 2021.11.09 P4824 [USACO15FEB]Censoring S与P3121 [USACO15FEB]Censoring G(KMP&&AC自动机)

    2021.11.09 P4824 [USACO15FEB]Censoring S与P3121 [USACO15FEB]Censoring G(KMP&&AC自动机) https://w ...

  7. 洛谷 P3121 【[USACO15FEB]审查(黄金)Censoring (Gold)】

    被自己学校OJ的毒瘤测评姬卡到自闭 Hash+栈+优化暴力 其实思路也很简单,就是把单词存进一个结构体,记录其哈希值和长度,然后就可以开始匹配了 但是,理论复杂度很高,为\(O(n*length)\) ...

  8. 洛谷P3121 【[USACO15FEB]审查(黄金)Censoring (Gold)】

    双栈+AC自动机 这题其实跟一道KMP算法的题有一些渊源,它就是这道题的简单板. Clear: 给你两个串A,B,每次在B串中从左到右找串A,并将该子串删除,直到找不到为止,问你能删几次. 样例输入: ...

  9. 【USACO15FEB】审查(黄金)Censoring (Gold)

    题目描述 Farmer John has purchased a subscription to Good Hooveskeeping magazine for his cows, so they h ...

随机推荐

  1. Marlin 擠出頭溫度控制PID值校正

    Marlin 擠出頭溫度控制PID值校正 擠出頭加熱器.溫度感應器安裝好後,先別急著直接指定工作溫度並且加熱.因為控制板上的溫度控制PID參數尚未校正.如果加熱速度過快,有可能會加熱過度並且導致零件燒 ...

  2. 准备mysql-connector-java

    下载mysql-connector-java:https://mvnrepository.com/artifact/mysql/mysql-connector-java 导入mysql-connect ...

  3. 20155228 基于VirtualBox安装Ubuntu和学习linux命令的学习经历和心得

    一.虚拟机VirtualBox的下载安装 基于VirtualBox虚拟机安装Ubuntu图文教程 虽然娄老师的教程对于VirtualBox的下载安装讲的很简单,可以说是一笔带过,但是我在下载安装的过程 ...

  4. QT 通过QNetworkReply *获取对应请求的URL地址

    [1]QT 通过QNetworkReply *获取对应请求的URL地址 reply->url().toString(); Good Good Study, Day Day Up. 顺序 选择 循 ...

  5. 设计模式之Memento(备忘机制)(转)

    Memento定义: memento是一个保存另外一个对象内部状态拷贝的对象.这样以后就可以将该对象恢复到原先保存的状态. Memento模式相对也比较好理解,我们看下列代码: public clas ...

  6. ref 参数与out参数

    变量作为参数传给方法,同时希望在方法执行完成后对参数,反应到变量上面.就需要用到ref和out这两个参数. ref参数:在 传入前必须先初始化 out参数:不需要做预先的处理

  7. WEB前端移动开发初始化

    meta篇 1.视窗宽度 <meta name="viewport" content="width=device-width,initial-scale=1.0,m ...

  8. source from Other`s

    以下链接转自其他努力的程序员们: 一一感谢! http完美讲解 -- https://www.cnblogs.com/ranyonsue/p/5984001.html http协议与soap协议之间的 ...

  9. [转载] Web Service工作原理及实例

    一.Web Service基本概念   Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求, ...

  10. SQL SERVER镜像配置(包含见证服务器)

    镜像简介   重要说明:保持数据库镜像运行.如果您关闭数据库镜像,则必须执行完全备份并还原数据库以重建数据库镜像.   一. 简介 SQL SERVER 2005镜像基于日志同步,可良好实现故障转移. ...