子串查找

https://loj.ac/problem/103

题目描述

  给定一个字符串A和一个字符串B,求B在A中的出现次数。A和B中的字符均为英语大写字母或小写字母。

思路

  显然这是道字符串匹配题我,我们可以用KMP求解。但这里我主要想介绍一种更简单的方法:字符串Hash。我们去一个基数b,把字符串看做b进制的数。而为了尽快求出一定长度的字符串的Hash值,我们可以用滚动Hash。这一过程可以用递推完成:H(C,k+1)=H(C,k)*b + ck+1。因此我们可以求出从通过以下式子求出从k开始长n的字符串Hash值:

                H(C’)=H(C,k+n)-H(C,k)*bn

  那么做一遍就行了。

代码

#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
const ull b=131;
char s1[1000005],s2[1000005];
ull power[1000005],sum[1000005];
int main()
{
    scanf(" %s %s",s1+1,s2+1);
    power[0]=1;
    for(int i=1;i<1000000;i++)
        power[i]=power[i-1]*b;
    int m=strlen(s1+1),n=strlen(s2+1);
    for(int i=1;i<=m;i++)
        sum[i]=sum[i-1]*b+s1[i];
    ull s=0,ans=0;
    for(int i=1;i<=n;i++)
        s=s*b+s2[i];
    for(int i=0;i<=m-n;i++)
        if(s==sum[i+n]-sum[i]*power[n])ans++;
    printf("%lld",ans);
    return 0;
}

原文地址:https://www.cnblogs.com/fangbozhen/p/11618425.html

时间: 2024-11-15 03:13:00

子串查找的相关文章

LibreOJ #103. 子串查找

二次联通门 : LibreOJ #103. 子串查找 /* LibreOJ #103. 子串查找 kmp */ #include <cstdlib> #include <cstring> #include <cstdio> #define Max 1000900 int next[Max]; void Get_Next (char *line) { next[0] = -1; for (register int pos_1 = 0, pos_2 = -1, Len =

串、串的模式匹配算法(子串查找)BF算法、KMP算法

串的定长顺序存储#define MAXSTRLEN 255,//超出这个长度则超出部分被舍去,称为截断 串的模式匹配: 串的定义:0个或多个字符组成的有限序列S = 'a1a2a3--.an ' n = 0时为空串串的顺序存储结构:字符数组,串的长度就是数组末尾'\0'前面的字符个数数组需在定义时确定长度,有局限性数组的最大长度二:串的堆分配存储表示typedef struct { char *ch; //若是非空串,则按串长分配存储区 //否则ch为空 int length; //串长度}HS

Python 的字符串类子串查找函数

Python 的字符串类有个很好用的函数,可很方便的用于与查找Python字符串类型对象子串相关的操作,具体的API如下: | find(...) | S.find(sub [,start [,end]]) -> int | | Return the lowest index in S where substring sub is found, | such that sub is contained within s[start:end]. Optional | arguments start

字符串子串查找strstr

问题: 函数名: strstr 函数原型:char *strstr(const char *str1, const char *str2); 语法:* strstr(str1,str2) str1: 被查找目标 string expression to search. str2: 要查找对象 The string expression to find. 返回值:该函数返回str2第一次在str1中的地址,如果没有找到,返回NULL 例子: charstr[]="1234xyz"; ch

一本通 字符串 Oulipo 子串查找

题目描述 这是一道模板题. 给定一个字符串 和一个字符串 ,求 B 在 A 中的出现次数.A 和 B 中的字符均为英语大写字母或小写字母. A 中不同位置出现的 B 可重叠. 输入格式 输入共两行,分别是字符串 A 和字符串 B. 输出格式 输出一个整数,表示 B 在 A 中的出现次数. 样例 样例输入 zyzyzyz zyz 样例输出 3 数据范围与提示 1 <= A,B 的长度 <= 10~6~,A.B 仅包含大小写字母. 思路 使用哈希值表示较长串的子串的值,直接比较哈希值是否相等 代码

#103. 子串查找

内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 这是一道模板题. 给定一个字符串 A AA 和一个字符串 B BB,求 B BB 在 A AA 中的出现次数. A AA 中不同位置出现的 B BB 可重叠. 输入格式 输入共两行,分别是字符串 A AA 和字符串 B BB. 输出格式 输出一个整数,表示 B BB 在 A AA 中的出现次数. 样例 样例输入 zyzyzyz zyz 样例输出 3

第46课 查找对话框的功能实现

1. 文本查找功能的核心思想 (1)获取当前光标的位置并作为起始点 (2)向后(前)查找目标第一次出现的位置 (3)通过目标位置以及目标长度在文本框中进行标记 2. QString类中提供的子串查找相关函数 (1)indexOf:从指定位置向后(即字符串末尾位置)查找目标子串的下标位置 (2)lastIndexOf:从指定位置向前(即字符串开始位置)查找目标子串的下标位置 (3)QString类中查找函数所使用的下标位置 QString text = "abcdefcdg"; QStr

字符串查找以及KMP算法

字符串查找和匹配是一个很常用的功能,比如在爬虫,邮件过滤,文本检索和处理方面经常用到.相对与C,python在字符串的查找方面有很多内置的库可以供我们使用,省去了很多代码工作量.但是我们还是需要了解一些常用的字符串查找算法的实现原理. 首先来看python内置的查找方法.查找方法有find,index,rindex,rfind方法.这里只介绍下find方法.find方法返回的是子串出现的首位置.比如下面的这个,返回的是abc在str中的首位置也就是3.如果没找到将会返回-1 str = "dkj

String方法

构造函数: String() String(char[] chars) String(String strObj) String(byte asciiChars[]) 整型和字符串相互转换: String到int:int i = Integer.parseInt(String s) int i = Integer.valueOf(str).intValue() int到String:String s = String.valueOf(i) String s = Integer.toString(