Scu4438 栈+哈希
题目描述
现在给定一个你很讨厌的字符串 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 栈+哈希相关推荐
- LeetCode 1124. 表现良好的最长时间段(单调栈/哈希)
文章目录 1. 题目 2. 解题 2.1 单调栈 2.2 哈希 1. 题目 给你一份工作时间表 hours,上面记录着某一位员工每天的工作小时数. 我们认为当员工一天中的工作小时数大于 8 小时的时候 ...
- 单调栈 leetcode整理(二)
目录 为什么单调栈的时间复杂度是O(n) 496. 下一个更大元素 I 方法一:暴力 方法二:单调栈+哈希表 739. 每日温度 单调栈模版解 优化 503. 下一个更大元素 II 单调栈+循环遍历 ...
- 【代码随想录】【LeetCode】自学笔记07 - 栈和队列
总结 基础补牢:[https://blog.csdn.net/tham_/article/details/44733101] 根据[http://c.biancheng.net/view/3354.h ...
- 【华为机考】专题突破 第一周:单调栈 739 、503 、901、84
刷题顺序参考于 <2023华为机考刷题指南:八周机考速通车> 前言 单调栈:分为单调递增和单调递减栈.(栈内元素成递增或者递减性): 单调递增栈:从栈底到栈顶数据是从大到小,即 栈内的元素 ...
- [力扣刷题总结](栈和单调栈篇)
文章目录 ~~~~~~~~~~~~栈~~~~~~~~~~~~ 155. 最小栈 解法1:链表 剑指 Offer 31. 栈的压入.弹出序列 解法1:模拟栈 20. 有效的括号 解法1:栈 相似题目: ...
- Leecode大厂热题100道系列题解
最近规划利用空闲时间,刷一遍大厂笔试中出题频率Top100的算法题,以下是我个人做的题解,每个题都尽量囊括了所有解法,并做到了最优解,欢迎大家收藏!留言! 题解会定期维护和更新! 序号 题解 分类 T ...
- 前端面试题大集合:来自真实大厂的532道面试题(只有题,没有答案)
答案自己谷歌或百度找. 一.来源背景 面试题是来自微博@牛客网发布的真实大厂前端面经题目,我一直在收集题目长期一个一个的记录下来的,可能会有重复,但基本前端的面试大纲和需要掌握的知识都在其中了,面试题 ...
- 算法与数据结构+LeetCode题解-Js版
LeetCode题解Js版 https://webbj97.github.io/leetCode-Js/ 题外话 LeetCode题解:传送门 前端笔记:传送门 项目背景 旨在提高自己对算法的理解,将 ...
- java基础总结笔记
java总结笔记 2021年1月26日 java软件工程师: jdk:Java开发工具包:(下载下来,自带jvm) jvm:java虚拟机: window常用Dos命令: - exit:退出当前Dos ...
最新文章
- 外威客外包网站Elance
- Android--数据存储
- Item 16: Avoid Creating Unnecessary Objects(Effective C#)
- android 定时开关机,android 定时关机
- Windows操作系统装机必备软件,值得收藏!
- 使用webots对并联结构进行仿真
- Sublime Text 2 设置文件详解转
- [免费配音软件]配音助手1.0 阿里云配音软件
- 平均年薪50万,人才缺口30.8万,职场人拿下这个法律证书有多香!
- dvi黑屏解决方法_电视维修|电视机屏幕出现条纹该怎么解决?
- 惠普笔记本固态装系统。
- 微信小程序支付签名生成(客户端)
- 【25.93%】【676D】Theseus and labyrinth
- 编程实现古典问题(兔子生崽):有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
- java正则表达式 字符串取开头数字 结尾数字 取反
- AnalyticDB PostgreSQL高可用整理
- 【JS】Number
- python求质数和_python 求质数
- 基于JavaEE的海鲜水产销售管理系统的设计
- C++ 二叉树的层次建树及其遍历