【字符串哈希】【BKDRhash】【Rabin-Karp算法】模板

#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<set>
using namespace std;
#define MAXN 100001
typedef unsigned long long ull;
const ull seed=31;
ull seeds[MAXN];
char s[MAXN],s2[MAXN];
int poss[MAXN];
//暴力字符串比较
bool Strcmp(const char a[],const int &L1,const int &R1,
const char b[],const int &L2,const int &R2)
{
	for(int i=L1,j=L2;i<R1;++i,++j)
	  if(a[i]!=b[j])
	    return 0;
	return 1;
}
//自然上溢,L首指针,R尾指针,左闭右开
ull BKDRhash(const char str[],const int &L,const int &R)
{
	ull res=0;
	for(int i=L;i<R;++i)
	  res=res*seed+str[i];
	return res;
}
//预处理,便于hash(s[i...i+m-1]和hash(s[i+1...i+m]之间的转移)
void init_seeds()
{
	seeds[0]=1;
	for(int i=1;i<MAXN;++i)
	  seeds[i]=seeds[i-1]*seed;
}
//文本串查找,s文本串,sub子串
int RabinKarp(const char s[],const char sub[])
{
	int n=strlen(s),m=strlen(sub);
	ull hsub=BKDRhash(sub,0,m),hs=BKDRhash(s,0,m);
	for(int i=0;i<=n-m;++i)
	  {
	  	if(hs==hsub && Strcmp(s,i,i+m,sub,0,m))
	      return i;
	    hs=(hs-s[i]*seeds[m-1])*seed+s[i+m];//O(1)转移
	  }
	return -1;
}
int main()
{
	init_seeds();
	while(1)
	  {
	  	scanf("%s%s",s,s2);
	  	printf("%d\n",RabinKarp(s,s2));
	  }
	return 0;
}
时间: 2024-10-21 02:22:04

【字符串哈希】【BKDRhash】【Rabin-Karp算法】模板的相关文章

Rabin Karp 算法实战

关键字 Rabin karp 算法, C++, ubuntu 14.04, linux, big integer, gmp 为了计算冗余度, 我写出了如下算法 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59

字符串哈希(自然溢出模板)

P3370 [模板]字符串哈希 题目描述 如题,给定N个字符串(第i个字符串长度为Mi,字符串内包含数字.大小写字母,大小写敏感),请求出N个字符串中共有多少个不同的字符串. 输入输出格式 输入格式: 第一行包含一个整数N,为字符串的个数. 接下来N行每行包含一个字符串,为所提供的字符串. 输出格式: 输出包含一行,包含一个整数,为不同的字符串个数. 输入输出样例 输入样例#1: 5 abc aaaa abc abcc 12345 输出样例#1: 4 说明 时空限制:1000ms,128M 数据

[模板]字符串哈希的简易做法

题目描述 如题,给定N个字符串(第i个字符串长度为Mi,字符串内包含数字.大小写字母,大小写敏感),请求出N个字符串中共有多少个不同的字符串. 友情提醒:如果真的想好好练习哈希的话,请自觉,否则请右转PJ试炼场:) 输入输出格式 输入格式: 第一行包含一个整数N,为字符串的个数. 接下来N行每行包含一个字符串,为所提供的字符串. 输出格式: 输出包含一行,包含一个整数,为不同的字符串个数. 输入输出样例 输入样例#1: 5 abc aaaa abc abcc 12345 输出样例#1: 4 说明

洛谷——P3370 【模板】字符串哈希

题目描述 如题,给定N个字符串(第i个字符串长度为Mi,字符串内包含数字.大小写字母,大小写敏感),请求出N个字符串中共有多少个不同的字符串. 友情提醒:如果真的想好好练习哈希的话,请自觉,否则请右转PJ试炼场:) 输入输出格式 输入格式: 第一行包含一个整数N,为字符串的个数. 接下来N行每行包含一个字符串,为所提供的字符串. 输出格式: 输出包含一行,包含一个整数,为不同的字符串个数. 输入输出样例 输入样例#1: 5 abc aaaa abc abcc 12345 输出样例#1: 4 说明

洛谷 P3370 【模板】字符串哈希

题目描述 如题,给定N个字符串(第i个字符串长度为Mi,字符串内包含数字.大小写字母,大小写敏感),请求出N个字符串中共有多少个不同的字符串. 友情提醒:如果真的想好好练习哈希的话,请自觉,否则请右转PJ试炼场:) 输入输出格式 输入格式: 第一行包含一个整数N,为字符串的个数. 接下来N行每行包含一个字符串,为所提供的字符串. 输出格式: 输出包含一行,包含一个整数,为不同的字符串个数. 输入输出样例 输入样例#1: 5 abc aaaa abc abcc 12345 输出样例#1: 4 说明

luogu P3370 【模板】字符串哈希

题目描述 如题,给定N个字符串(第i个字符串长度为Mi,字符串内包含数字.大小写字母,大小写敏感),请求出N个字符串中共有多少个不同的字符串. 友情提醒:如果真的想好好练习哈希的话,请自觉,否则请右转PJ试炼场:) 输入输出格式 输入格式: 第一行包含一个整数N,为字符串的个数. 接下来N行每行包含一个字符串,为所提供的字符串. 输出格式: 输出包含一行,包含一个整数,为不同的字符串个数. 输入输出样例 输入样例#1: 5 abc aaaa abc abcc 12345 输出样例#1: 4 说明

luoguP3370 【模板】字符串哈希 [hash]

题目描述 如题,给定N个字符串(第i个字符串长度为Mi,字符串内包含数字.大小写字母,大小写敏感),请求出N个字符串中共有多少个不同的字符串. 友情提醒:如果真的想好好练习哈希的话,请自觉,否则请右转PJ试炼场:) 输入输出格式 输入格式: 第一行包含一个整数N,为字符串的个数. 接下来N行每行包含一个字符串,为所提供的字符串. 输出格式: 输出包含一行,包含一个整数,为不同的字符串个数. 输入输出样例 输入样例#1: 5 abc aaaa abc abcc 12345 输出样例#1: 4 说明

字符串哈希 (转载)

基本概念所谓完美哈希函数,就是指没有冲突的哈希函数,即对任意的 key1 != key2 有h(key1) != h(key2).设定义域为X,值域为Y, n=|X|,m=|Y|,那么肯定有m>=n,如果对于不同的key1,key2属于X,有h(key1)!=h(key2),那么称h为完美哈希函数,当m=n时,h称为最小完美哈希函数(这个时候就是一一映射了). 在处理大规模字符串数据时,经常要为每个字符串分配一个整数ID.这就需要一个字符串的哈希函数.怎么样找到一个完美的字符串hash函数呢?有

hdu 1711 KMP算法模板题

题意:给你两个串,问你第二个串是从第一个串的什么位置開始全然匹配的? kmp裸题,复杂度O(n+m). 当一个字符串以0为起始下标时.next[i]能够描写叙述为"不为自身的最大首尾反复子串长度". 当发生失配的情况下,j的新值next[j]取决于模式串中T[0 ~ j-1]中前缀和后缀相等部分的长度, 而且next[j]恰好等于这个最大长度. 防止超时.注意一些细节.. 另外:尽量少用strlen.变量记录下来使用比較好,用字符数组而不用string //KMP算法模板题 //hdu

算法模板学习专栏之总览(会慢慢陆续更新ing)

博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/7495310.html特别不喜欢那些随便转载别人的原创文章又不给出链接的所以不准偷偷复制博主的博客噢~~ 数据结构和算法模板系列之总览 很早前就打算将自己学过的数据结构和算法等知识和模板做个整理,但一直没有抽出时间来弄.现在打算每周抽空一点时间陆陆续续地将自己平时用的模板都贴上来,这里先做个综述. 主要针对那些想要准备机试.刷题或者刚刚接触ACM的初学者来说,对