双栈+AC自动机

这题其实跟一道KMP算法的题有一些渊源,它就是这道题的简单板。

Clear:

给你两个串A,B,每次在B串中从左到右找串A,并将该子串删除,直到找不到为止,问你能删几次。

样例输入:

abc

abcabcabaabcbccc

样例输出:

5

思路:

开一个栈,每次放入被匹配字符串的一个字符。如果当前栈中字符数量大于等于匹配串的长度,开始匹配,如果有一个单词匹配失败,break掉,继续放字符。

#include<bits/stdc++.h>
using namespace std;
int lc,lb,cnt,flag,ans;
char a[10000001];
string b,c;
int main()
{
cin>>b>>c;
lb=b.size();
lc=c.size();
for(int i=0;i<lc;i++)
{
a[++cnt]=c[i];
if(cnt<b.size())
{
continue;
}
if(a[cnt]!=b[lb-1])
{
continue;
}
flag=0;
for(int i=cnt-lb+1,j=0;i<cnt;i++,j++)//匹配
{
if(a[i]!=b[j])
{
flag=1;//发现目标串,标记。
break;
}
}
if(!flag)
{
ans++;
cnt-=lb;//减长度
}
}
printf("%d\n",ans);//输出
return 0;
}

那么经过这题的思考之后,加强版(就是这题)的思路也应该油然而生了——我们同样用栈做,一个栈命名为s2,用来表示当前节点跑到了AC自动机中的trie树哪里了,另一个栈s3,用来表示最后的字符串留下了原字符串的哪些位上的字符。

如果发现当前这一个栈中的字符的后缀是单词,直接减去单词的长度(所以isword要存的是长度)。

剩下就是输出了。

友情提醒:在洛谷提交的话,末尾最好加个‘\n’。

代码:

#include<bits/stdc++.h>
using namespace std;
int cnt,s2[100010],s3[100010],n,wei,top;//s2是存root,s3是存剩下的。
string s1,s;
queue<int>q;
struct data
{
int b[26],fail,isword;//isword用来存s.size。
}a[1000001];
void build(string t)//建trie树
{
int root=0;
for(int i=0;t[i];i++)
{
int x=t[i]-'a';
if(!a[root].b[x])a[root].b[x]=++cnt;
root=a[root].b[x];
}
a[root].isword=t.size();
}
int main()
{
cin>>s;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
cin>>s1;
build(s1);
}
for(int i=0;i<26;i++)
{
if(a[0].b[i])
{
q.push(a[0].b[i]);
}
}
while(!q.empty())
{
int k=q.front();
q.pop();
for(int i=0;i<26;i++)
{
if(a[k].b[i])
{
a[a[k].b[i]].fail=a[a[k].fail].b[i];
q.push(a[k].b[i]);
}else{
a[k].b[i]=a[a[k].fail].b[i];
}
}
}
int root=0;
//双栈走起
while(wei<s.size())
{
int x=s[wei]-'a';
root=a[root].b[x];
s2[++top]=root;
s3[top]=wei;
if(a[root].isword)
{
top-=a[root].isword;
if(top==0)
{
root=top;
}else{
root=s2[top];
}
}
wei++;
}
for(int i=1;i<=top;i++)
{
cout<<s[s3[i]];
}
putchar('\n');
return 0;
}

QAQAQAQ

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

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

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

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

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

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

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

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

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

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

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

  6. P3121 [USACO15FEB]审查(黄金)Censoring (Gold)

    吐槽 数据太水了吧,我AC自动机的trie建错了结果只是RE了两个点,还以为数组开小了改了好久 思路 看到多模板串,字符串匹配,且模板串总长度不长,就想到AC自动机 然后用栈维护当前的字符串位置,如果 ...

  7. [洛谷P3121] 审查(黄金) (AC自动机)

    题目描述 FJ把杂志上所有的文章摘抄了下来并把它变成了一个长度不超过10^5的字符串S.他有一个包含n个单词的列表,列表里的n个单词记为t_1...t_N.他希望从S中删除这些单词. FJ每次在S中找 ...

  8. 洛谷 P3120 [USACO15FEB]牛跳房子(金)Cow Hopscotch (Gold)

    P3120 [USACO15FEB]牛跳房子(金)Cow Hopscotch (Gold) 就像人类喜欢跳格子游戏一样,FJ的奶牛们发明了一种新的跳格子游戏.虽然这种接近一吨的笨拙的动物玩跳格子游戏几 ...

  9. 洛谷P3120 [USACO15FEB]牛跳房子(动态开节点线段树)

    题意 题目链接 Sol \(f[i][j]\)表示前\(i\)行\(j\)列的贡献,转移的时候枚举从哪里转移而来,复杂度\(O(n^4)\) 然后考虑每一行的贡献,动态开节点线段树维护一下每种颜色的答 ...

随机推荐

  1. hadoop之yarn详解(基础架构篇)

    本文主要从yarn的基础架构和yarn的作业执行流程进行阐述 一.yarn的概述 Apache Yarn(Yet Another Resource Negotiator的缩写)是hadoop集群资源管 ...

  2. CSS3自定义浏览器滚动条样式

    一个完整滚动条右以下部分组成: ::-webkit-scrollbar 滚动条整体部分,常用属性:width,height,background,border: ::-webkit-scrollbar ...

  3. 解决MybatisGenerator多次运行mapper生成重复内容

    MybatisGenerator插件是Mybatis官方提供的,这个插件存在一个固有的Bug,即当第一次生成了Mapper.xml之后,再次运行会导致Mapper.xml生成重复内容,而影响正常的运行 ...

  4. 一步一步剖析Dictionary实现原理

    本文是对c#中Dictionary内部实现原理进行简单的剖析.如有表述错误,欢迎指正. 主要对照源码来解析,目前对照源码的版本是.Net Framwork 4.8,源码地址. 1. 关键的字段和Ent ...

  5. [LeetCode] 822. Card Flipping Game

    Description On a table are N cards, with a positive integer printed on the front and back of each ca ...

  6. c++ 对特定进程的内存监控

    在工具实现的过程中,遇到了内存爆了的问题,部分模型的规模可以达到10的100次方方甚至1000次方.(工具的主要算法涉及到了递归,递归深度会很深,所以也用到了ulimit修改栈空间来缓解爆栈的问题,治 ...

  7. 【Java】JDK安装及环境变量配置

    第一步:下载所需jdk(本次下载Win64位 java1.8...版本) 第二步:点击文件安装,直接下一步到底,成功安装,点击关闭. 第三步:安装完JDK后配置环境变量  计算机→属性→高级系统设置→ ...

  8. TCP三次握手和四次握手全过程 为什么要三次握手而不是二次握手?

    三次握手 第一次握手: 客户端发送syn包(syn=x)到服务器,并进入SYN_SEND状态,等待服务器确认: 第二次握手: 服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送 ...

  9. MySQL学习(三)MySQL锁与事务

    本章我们着重讨论MySQL锁机制的特点,常见的锁问题,以及解决MySQL锁问题的一些方法或建议. 一.MySQL锁概述 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支 ...

  10. Head First设计模式——观察者模式

    1.气象监测应用,错误示范 有一个气象站,分别有三个装置:温度感应装置,湿度感应装置,气压感应装置.WeathData对象跟踪气象站数据,WeathData有MeasurmentsChanged()方 ...