文章目录

  • 1. 题目
    • 1.1 题目链接
    • 1.2 题目大意
  • 2. Accepted代码
    • 2.1 KMP解法
    • 2.2 哈希法(有推导过程)

1. 题目

1.1 题目链接

http://poj.org/problem?id=3461
类似题目:LeetCode 30. 串联所有单词的子串(字符串哈希)

1.2 题目大意

模式串在主串中出现过几次。

2. Accepted代码

2.1 KMP解法

#include <stdio.h>
#include <iostream>
#include <cstring>
int next[10001];
char a[1000001], b[10001];
void calNexts(char *b, int m, int *next)
{next[0] = -1;int j = 0, k = -1;while(j < m){if(k == -1 || b[j] == b[k]){j++;k++;next[j] = k;}elsek = next[k];}
}
int str_kmp(char *a, int n, char *b, int m)
{calNexts(b, m, next);int i = 0, j = 0, times = 0;while(i < n && j < m){if(j == -1 || a[i] == b[j]){i++;j++;}else{j = next[j];}if(j == m){times++;j = next[j];}}return times;
}
int main()
{int count;std::cin >> count;while(count--){scanf("%s",&b);scanf("%s",&a);printf("%d\n",str_kmp(&a[0], strlen(a), &b[0], strlen(b)));}return 0;
}

2.2 哈希法(有推导过程)



参考别人的哈希函数,哈希值的求法很犀利
自己推导的过程如下:

/*** @description: poj 3461 字符串匹配,哈希法* @author: michael ming* @date: 2019/6/26 21:59* @modified by: */
#include <stdio.h>
#include <iostream>
#include <cstring>
#include <cmath>
#define K 25    //K大于等于字符集数 k>=25
typedef unsigned long long ull;
char a[1000001], b[10001];
ull ha[1000001];
ull powk[10001];//存储K的幂值
using namespace std;
void fillpowk(int m)
{powk[0] = 1;for(int i = 1; i <= m; ++i)powk[i] = powk[i-1]*K;
}
ull hashf(int m, char *str)
{ull value = 0;for(int i = 0; i < m; ++i)value = value * K + str[i];return value;
}
int str_RK(char *a, int n, char *b, int m)//a是主串,b是模式串
{fillpowk(m);int i, times = 0;ull hash_val, value = 0;value = hashf(m,b); //计算模式串的hash值valueha[0] = ull(a[0]);for(i = 1; i < n; ++i)ha[i] = ha[i-1] * K + a[i];for(i = 0; i < n-m+1; ++i)//最多n-m+1次比较{if(i == 0)hash_val = hashf(m,a);elsehash_val = ha[i+m-1] - ha[i-1]*powk[m];//这个公式可以自己推导一下if(hash_val == value){//如果子串哈希值等于模式串的,匹配成功(该哈希无冲突)times++;}}return times;
}
int main()
{int count;std::cin >> count;while(count--){scanf("%s",&b);scanf("%s",&a);printf("%d\n",str_RK(&a[0], strlen(a), &b[0], strlen(b)));}return 0;
}

POJ 3461 字符串匹配(KMP / 哈希(有推导))相关推荐

  1. 字符串匹配KMP算法

    字符串匹配KMP KMP过程其实就是去找下一个更好的状态的过程,省略去了中间穷举的无用过程,直接跳到下一个更好的状态,通过模式串本身的信息,站在模式串的角度来考虑问题 取长的一对 若想让模式串直接从S ...

  2. kmp算法详解php,php中字符串匹配KMP算法实现例子

    KMP算法是一个比较高级的算法了,加了改进了,下面我们来在php中实现KMP算法,希望例子对各位同学会带来帮助哦. kmp算法是一种改进的字符串匹配算法,由D.E.Knuth与V.R.Pratt和J. ...

  3. C++实现字符串匹配KMP算法

    文章目录 1. 概述 2. 代码实现 3. 代码测试 1. 概述 Kmp算法的介绍及思想参阅下面两篇文章: 字符串匹配KMP算法 算法)通俗易懂的字符串匹配KMP算法及求next值算法 2. 代码实现 ...

  4. 字符串匹配 KMP算法

    问题描述:字符串匹配即查找待匹配字符串(模式串)p在主串s中的位置.一般处理这种问题往往采用简单粗暴的方法--暴力匹配法.所谓暴力匹配法,就是对主串s的每一个字符与要匹配的字符串p的每个字符进行逐一匹 ...

  5. 字符串匹配——KMP算法

    字符串匹配--KMP算法 ​ 字符串匹配是计算机编程中最常使用到的基础算法之一.字符串匹配相关的算法很多,Knuth-Morris-Pratt(KMP)算法是最常用的之一.最近在学习KMP算法,学习了 ...

  6. 字符串匹配のKMP【专题@AbandonZHANG】

    算法详解 很长时间内都没有能够很理解KMP算法的精髓,尤其是很多书上包括<算法导论>没有把next函数(亦或 π函数)讲解的很透彻. 今天去看了matrix67大牛博客中关于kmp部分的讲 ...

  7. 字符串匹配のKMP【@Abandon】

    算法详解 很长时间内都没有能够很理解KMP算法的精髓,尤其是很多书上包括<算法导论>没有把next函数(亦或 π函数)讲解的很透彻. 今天去看了matrix67大牛博客中关于kmp部分的讲 ...

  8. C语言实现字符串匹配KMP算法

    相信很多人(包括自己)初识KMP算法的时候始终是丈二和尚摸不着头脑,要么完全不知所云,要么看不懂书上的解释,要么自己觉得好像心里了解KMP算法的意思,却说不出个究竟,所谓知其然不知其所以然是也. 字符 ...

  9. [JAVA][算法] [字符串匹配]KMP

    我们为什么需要KMP? 在字符串匹配问题中,我们需要找到匹配串pattern在原串text中的位置,一种显而易见的思路就是暴力匹配,如图所示,我们把pattern放置到text中的每个位置进行比较即可 ...

最新文章

  1. 起薪2万的爬虫工程师, Python需要学到什么程度才可以就业?
  2. JavaScript中的字符串操作(转)
  3. 如何通过HBuilderX运行微信小程序,启动Enable IDE Service,X initialize 解决方案
  4. C++生成随机数:负二项分布/帕斯卡分布(negative binomial distribution)
  5. python怎样实现封装_大牛教你如何封装 Python 代码,实现自动发送邮件只需三行代码...
  6. bash-shell详解
  7. Android之ListView异步加载图片且仅显示可见子项中的图片
  8. 实时计算 Flink性能调优
  9. 七牛云注册创建oss并配置自定义域名
  10. IplImage, CvMat, Mat 的关系和相互转换(转)
  11. jquery 数字滚动特效 数字自增特效 数字位数动态适应
  12. Mac终端:pip command not found
  13. 基于Vue.js 2.x系列 + Element UI + RBAC/AUTH权限 的响应式后台管理系统
  14. 英语流利说 核心课 level6 unit2
  15. python编写错误怎么修改_在Python的Django框架中编写错误提示页面
  16. 计算机自带pdf吗,电脑自带pdf转换工具哪个好?办公必备!
  17. java计算机二级知识点、易错点整理(一)
  18. 常用且标准的FPGA设计规范
  19. pytorch股票预测
  20. medusa破解ssh

热门文章

  1. 求一个简单的php购物车,PHP简单实现购物车
  2. mysql中下杠怎么打_怎么打字母下方的短横杠?,下横杠怎么打
  3. 嵌入式数据库sqlite在ARM上的的移植和使用
  4. uboot源码——内核启动分析
  5. java 检查进程是否存在
  6. hdu4027Can you answer these queries?
  7. oracle table 函数使用
  8. DEBUG主要命令(转)
  9. sprintf()、fprintf()的使用方法
  10. 详解AST抽象语法树