题目描述

现在给定一个你很讨厌的字符串 A 和另外一个字符串 B,请删除在 B 中出现的所有 A。
请注意:有可能在删除一个 A 后导致新的 A 出现,此时请继续删除,直到没有 A。

输入格式

输入为多组数据,请处理到 EOF。
对于每组数据:
第一行为你很讨厌的字符串 A,第二行为另外一个字符串 B,均仅包括小写字母。
保证 A串 和 B串 的长度不超过 5000000 且 A、B 均不为空串。

输出格式

对于每组数据,输出一行,即完成删除后的字符串。

样例输入

abc
aaabcbc
b
bbb
abc
ab

样例输出

a

ab

样例解释

第一组数据的删除过程:
aaabcbc -> aa[abc]bc -> aabc -> a[abc] -> a
第二组数据的删除过程:
bbb -> [b]bb -> bb -> [b]b -> b -> [b] ->
第三组数据由于讨厌的字符串并没有出现,所以没有被删除任何一个部分。

思路:开始毫无思路,后来百度他人题解看到了别人的标签,栈,瞬间思路就来了,就像括号匹配一样,这个题目也可以这样做,只是判断是否匹配复杂度很高,这个时候就可以用到哈希,用O(1)的时间判断两个字符串是否匹配,所以总复杂度就是O(n)。

代码:

#include<bits/stdc++.h>
#define LL long long
#define ULL unsigned long long
#define Max 5000005
const LL mod=1e9+7;
const ULL base=131;
const LL LL_MAX=9223372036854775807;
using namespace std;
ULL Hash[Max],p[Max];
char Stack[Max],a[Max],b[Max];
inline ULL getHashRange(int l,int r){return Hash[r]-Hash[l-1]*p[r-l+1];
}
void init(){p[0]=1;for(int i=1;i<Max;i++)p[i]=p[i-1]*base;
}
int main()
{init();while(scanf("%s%s",a+1,b+1)==2){memset(Stack,0,sizeof(Stack));int lena=strlen(a+1),lenb=strlen(b+1);ULL Hasha=0;for(int i=1;i<=lena;i++)Hasha=Hasha*base+a[i];int top=1;for(int i=1;i<=lenb;i++){Hash[top]=Hash[top-1]*base+b[i];Stack[top]=b[i];if(top>=lena){ULL t=getHashRange(top-lena+1,top);if(t==Hasha){top=max(1,top-lena+1);}elsetop++;}elsetop++;}Stack[top]='\0';printf("%s\n",Stack+1);}return 0;
}

Scu4438 栈+哈希相关推荐

  1. LeetCode 1124. 表现良好的最长时间段(单调栈/哈希)

    文章目录 1. 题目 2. 解题 2.1 单调栈 2.2 哈希 1. 题目 给你一份工作时间表 hours,上面记录着某一位员工每天的工作小时数. 我们认为当员工一天中的工作小时数大于 8 小时的时候 ...

  2. 单调栈 leetcode整理(二)

    目录 为什么单调栈的时间复杂度是O(n) 496. 下一个更大元素 I 方法一:暴力 方法二:单调栈+哈希表 739. 每日温度 单调栈模版解 优化 503. 下一个更大元素 II 单调栈+循环遍历 ...

  3. 【代码随想录】【LeetCode】自学笔记07 - 栈和队列

    总结 基础补牢:[https://blog.csdn.net/tham_/article/details/44733101] 根据[http://c.biancheng.net/view/3354.h ...

  4. 【华为机考】专题突破 第一周:单调栈 739 、503 、901、84

    刷题顺序参考于 <2023华为机考刷题指南:八周机考速通车> 前言 单调栈:分为单调递增和单调递减栈.(栈内元素成递增或者递减性): 单调递增栈:从栈底到栈顶数据是从大到小,即 栈内的元素 ...

  5. [力扣刷题总结](栈和单调栈篇)

    文章目录 ~~~~~~~~~~~~栈~~~~~~~~~~~~ 155. 最小栈 解法1:链表 剑指 Offer 31. 栈的压入.弹出序列 解法1:模拟栈 20. 有效的括号 解法1:栈 相似题目: ...

  6. Leecode大厂热题100道系列题解

    最近规划利用空闲时间,刷一遍大厂笔试中出题频率Top100的算法题,以下是我个人做的题解,每个题都尽量囊括了所有解法,并做到了最优解,欢迎大家收藏!留言! 题解会定期维护和更新! 序号 题解 分类 T ...

  7. 前端面试题大集合:来自真实大厂的532道面试题(只有题,没有答案)

    答案自己谷歌或百度找. 一.来源背景 面试题是来自微博@牛客网发布的真实大厂前端面经题目,我一直在收集题目长期一个一个的记录下来的,可能会有重复,但基本前端的面试大纲和需要掌握的知识都在其中了,面试题 ...

  8. 算法与数据结构+LeetCode题解-Js版

    LeetCode题解Js版 https://webbj97.github.io/leetCode-Js/ 题外话 LeetCode题解:传送门 前端笔记:传送门 项目背景 旨在提高自己对算法的理解,将 ...

  9. java基础总结笔记

    java总结笔记 2021年1月26日 java软件工程师: jdk:Java开发工具包:(下载下来,自带jvm) jvm:java虚拟机: window常用Dos命令: - exit:退出当前Dos ...

最新文章

  1. 外威客外包网站Elance
  2. Android--数据存储
  3. Item 16: Avoid Creating Unnecessary Objects(Effective C#)
  4. android 定时开关机,android 定时关机
  5. Windows操作系统装机必备软件,值得收藏!
  6. 使用webots对并联结构进行仿真
  7. Sublime Text 2 设置文件详解转
  8. [免费配音软件]配音助手1.0 阿里云配音软件
  9. 平均年薪50万,人才缺口30.8万,职场人拿下这个法律证书有多香!
  10. dvi黑屏解决方法_电视维修|电视机屏幕出现条纹该怎么解决?
  11. 惠普笔记本固态装系统。
  12. 微信小程序支付签名生成(客户端)
  13. 【25.93%】【676D】Theseus and labyrinth
  14. 编程实现古典问题(兔子生崽):有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
  15. java正则表达式 字符串取开头数字 结尾数字 取反
  16. AnalyticDB PostgreSQL高可用整理
  17. 【JS】Number
  18. python求质数和_python 求质数
  19. 基于JavaEE的海鲜水产销售管理系统的设计
  20. C++ 二叉树的层次建树及其遍历

热门文章

  1. 虹科案例 | 用AR进行建筑规划,这家公司竟已“走近”了元宇宙?
  2. 数据获取网络爬虫之--爬取小姐姐图片
  3. 密码学原理-篇1:古典密码学
  4. JavaScript高级程序设计(第四章)
  5. 【个人Onenote笔记】整理+搬运
  6. UltraLAB台式图形工作站(图形生成王者~视景仿真工作站介绍)
  7. 天池新人赛-零基础入门金融风控-贷款违约预测-排名174
  8. 关于SN74AHCT1G02DBVR
  9. 全屏文本编译器vim
  10. JAVA体系书籍大全