哈希基础例题

文章目录

    • 例题一:子串查找
    • 例题二:字符串的删除操作
    • 例题三:字符串合并操作的应用

哈希前置知识请戳这里-> 哈希绪论

昨天我们对哈希的基础知识有了一定的了解,并已经知道了如何求子串、拼接子串的哈希值,今天我们就这两个操作分析一些基础例题,加深理解和掌握。

例题一:子串查找

LOJ #103. 子串查找
显然这是一道kmp算法的模板题

朴素的做法是枚举文本串的每一个位置作为模式串开始比较的位置。设枚举到主串的位置是 i i i N N N为主串(即输入的第一行)的长度, M M M为模式串(即输入的第二行)的长度, s a sa sa为主串, s b sb sb为模式串,则当且仅当 s a sa sa i i i到第 i + M − 1 i+M-1 i+M1与模式串一一匹配,才能使 a n s + 1 ans+1 ans+1。这样在最坏情况下(比如 s a 、 s b sa、sb sasb所有字符均为 a a a),复杂度达到了 O ( N M ) O(NM) O(NM),是不可接受的。现在我们考虑用哈希处理,那么可以将第二步比较的操作复杂度降低到 O ( 1 ) O(1) O(1),因此只要先预处理出 s a sa sa的前缀哈希表,则当我们枚举每一个位置 i i i时,利用前缀表获得区间 [ i , i + M − 1 ] [i,i+M-1] [i,i+M1]子串的哈希值,再与 s b sb sb的哈希值相比较即可,总体复杂度就降低到了 O ( N + M ) O(N+M) O(N+M),已经和kmp算法一样优秀了就是常数有点大
下面来看代码:

#include
#include
#define ll long long
#define N 1000000007
#define M 14371003
#define max 1000005
char s[max], ss[max];
int a[max], p[max];
int main()
{
   
    scanf("%s%s", s + 1, ss + 1);
    int len = strlen(ss + 1), ans = 0, cnt = 0, l = strlen(s + 1);
    if (len > l) {
    printf("0"); return 0; }
    a[1] = s[1], p[0] 

你可能感兴趣的:(算法复习之字符串,字符串,算法,哈希,数据结构,hash)