LOJ #103. 子串查找 (Hash)
题意
给定两个字符串 \(A\) 和 \(B\),求 \(B\) 在 \(A\) 中的出现次数。
思路
这是一道 \(KMP\) 的模板题。
不过 \(Hash\) 是个好东西,可以用 \(Hash\) 代替 \(KMP\) 算法。
预处理两个字符串的哈希值,然后将 \(A\) 中所有长度为 \(len(B)\) 的子串的哈希值与 \(B\) 的哈希值比较即可。
时间复杂度 \(O(n + m)\),与 \(KMP\) 算法一样!
缺点就是常数略大,而且不能用 \(KMP\) 的 \(next\) 数组。
代码
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
const int maxn = 1e6 + 10;
const int base = 131;
ull h1[maxn], h2;
ull p[maxn];
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
string s1, s2;
cin >> s1 >> s2;
p[0] = 1;
for(int i = 0; i < s1.size(); ++i) {
h1[i + 1] = h1[i] * base + (ull)s1[i];
p[i + 1] = p[i] * base;
}
for(int i = 0; i < s2.size(); ++i) {
h2 = h2 * base + (ull)s2[i];
}
int ans = 0;
for(int i = s2.size(); i <= s1.size(); ++i) {
if(h1[i] - h1[i - s2.size()] * p[s2.size()] == h2) {
++ans;
}
}
cout << ans << endl;
return 0;
}
参考
LOJ #103. 子串查找 (Hash)的更多相关文章
- LOJ 103子串查找——用hash代替kmp算法
题意 给出两个字符串 $s_1,s_2$,求 $s_2$ 在 $s_1$ 中出现的次数. 分析 预处理出两个字符串的哈希值,再逐位比较. 时间复杂度为 $O(n+m)$,和 $kmp$ 算法一样. 可 ...
- 1953 Problem B #103. 子串查找
#include<stdio.h> #include<string.h> main() { char a[100],b[100]; int n,k,i; gets(a); ge ...
- LibreOJ #103. 子串查找
题目描述 这是一道模板题. 给定一个字符串 A AA 和一个字符串 B BB,求 B BB 在 A AA 中的出现次数. A AA 中不同位置出现的 B BB 可重叠. 输入格式 输入共两行,分别是字 ...
- 「LOJ#103」子串查找 (Hash
题目描述 这是一道模板题. 给定一个字符串 A A A 和一个字符串 B B B,求 B B B 在 A A A 中的出现次数.AAA 和 BBB 中的字符均为英语大写字母或小写字母. A A A 中 ...
- Loj 103、10043 (KMP统计子串个数)
KMP算法学习链接:https://blog.csdn.net/starstar1992/article/details/54913261/ KMP算法:可以实现复杂度为O(m+n) 为何简化了时间复 ...
- 第四十一课 KMP子串查找算法
问题: 右移的位数和目标串没有多大的关系,和子串有关系. 已匹配的字符数现在已经有了,部分匹配值还没有. 前六位匹配成功就去查找PMT中的第六位. 现在的任务就是求得部分匹配表. 问题:怎么得到部分匹 ...
- 串、串的模式匹配算法(子串查找)BF算法、KMP算法
串的定长顺序存储#define MAXSTRLEN 255,//超出这个长度则超出部分被舍去,称为截断 串的模式匹配: 串的定义:0个或多个字符组成的有限序列S = 'a1a2a3…….an ' n ...
- 第41课 kmp子串查找算法
1. 朴素算法的改进 (1)朴素算法的优化线索 ①因为 Pa != Pb 且Pb==Sb:所以Pa != Sb:因此在Sd处失配时,子串P右移1位比较没有意义,因为前面的比较己经知道了Pa != Sb ...
- 数据结构开发(14):KMP 子串查找算法
0.目录 1.KMP 子串查找算法 2.KMP 算法的应用 3.小结 1.KMP 子串查找算法 问题: 如何在目标字符串S中,查找是否存在子串P? 朴素解法: 朴素解法的一个优化线索: 示例: 伟大的 ...
随机推荐
- 利用float与overflow:hidden实现移动端两栏自适应布局
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- python3项目打包成exe可执行程序
使用pyinstaller将python文件打包成exe程序,打包步骤如下: 一.安装pyinstaller (1)win+R输入cmd,打开命令窗口 (2)安装pyinstaller,安装指令:pi ...
- div里添加元素样式
function YUEFEN() { $(".BBNL_2").click(function () { $(".BBNL_2").css("colo ...
- Cocos2d-x之UI控件简介
| 版权声明:本文为博主原创文章,未经博主允许不得转载. 在Cocos2d-x中提供了一种UI控件,UI控件是指用户交互界面的操作部件.UI控件可以是Button(按钮),CheckBox(选择框 ...
- Cocos2d-x之Vector<T>
| 版权声明:本文为博主原创文章,未经博主允许不得转载. Vector<T>是Cocos2d-x 3.x中推出的列表容器,在cocos2d-x3.0之前的版本是Array,因此它所能容 ...
- 插件化框架解读之so 文件加载机制(四)
阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680 提问 本文的结论是跟着 System.loadlibrary() ...
- 同一台机器上有多个Python版本?
有关Python网站上的官方文档,如何在Linux上的同一台机器上安装和运行多个版本的Python? 我可以找到大量的博客帖子和答案,但我想知道是否有“标准”官方方式这样做? 或者这完全取决于操作系统 ...
- Dijkstra的优先队列
模板 #include<iostream> #include<cstring> #include<algorithm> #include<cmath> ...
- Educational Codeforces Round 33 D. Credit Card
Credit Card time limit per test2 seconds memory limit per test256 megabytes Recenlty Luba got a cred ...
- canvas---从基础到实战
canvas是H5新增的一个元素,可以用来描绘各种你想描绘的东西. canvas本身没有绘制能力,你可以把它当做一个容器,需要我们用脚本,也就是js来给他灌满水. 兼容性 1. IE9版本以上.Fir ...