luogu 3618 误会

DP+Hash

题目链接

本题最后其实转化为字符串匹配问题。
直接用DP,状态转移,如果尾段匹配,f[i]=f[i-1]+f[i-len2],否则如果不匹配,f[i]=f[i-1]
字符串匹配当然可以用kmp,但是这里讲一讲hash的做法。

找出子段在原串中出现过的位置
比如原串ababaaba,子串aba,则能找到3个。
Hash的思路,对于原串,依次递推下去,s[i]=s[i-1]*base+s[i],其中base是我们的进制,可以设定成一个比较大的数。

那么如果要求字符串中位置(i-j)这段的hash,就是s[j]-s[i-1]*(base^(j-i+1)),我们可以预处理出两个串的Hash,然后枚举原串的子段位置,看Hash值是否和匹配串相同,如果相同就表示找到了(注意Hash是会有冲突的,只是如果我们把Hash函数设得很大,冲突的概率会非常小,理论上是会存在错掉的数据,如果想减少Hash错误的机率,可以用链表存下冲突的值,也可以用双重Hash)。

在上面我们可以看到求Hash值会很大,我们可以模一个很大的数,同时如果模完的两个值(1-j)Hash反而比短串(1-(i-1))Hash要小了,则要相应加上一个模值,在这里我们有一个很好的方法来处理,采用无符号类型来取代模运算,首先是运算会自然溢出,其次如果出现不够减的情况,溢出效果等价于取补,相当于加上了一个模值。
判断语句就可以这样:if(f[i]-f[i-len2]*b[len2]==x)
这里我们用unsigned long long来表示运算的数,当然也可以用其它无符号型。

#include<bits/stdc++.h>
using namespace std;
#define ULL unsigned long long
const int N=110000;
const int base=100000007;
const int MO=1000000007;
int ans,test,len1,len2;
ULL b[N],x,f[N],ff[N];
char s1[N],s2[N];
int main(){scanf("%d",&test);b[0]=1;for(int i=1;i<=110000;i++)b[i]=b[i-1]*base;for(int t=1;t<=test;t++){printf("Case #%d: ",t);scanf("%s",s1+1);len1=strlen(s1+1);scanf("%s",s2+1);len2=strlen(s2+1);x=0;for(int i=1;i<=len2;i++)x=x*base+s2[i]-'a'+1;for(int i=1;i<=len1;i++)f[i]=(f[i-1])*base+s1[i]-'a'+1;ans=0;for(int i=0;i<len2;i++)ff[i]=1;for(int i=len2;i<=len1;i++)if(f[i]-f[i-len2]*b[len2]==x)ff[i]=(ff[i-1]+ff[i-len2])%MO;else ff[i]=ff[i-1];printf("%d\n",ff[len1]);}return 0;
}

luogu 3618 误会 关于字符串Hash相关推荐

  1. hdu4821 字符串hash

    参考博客:点击打开链接 字符串hash典例. 这里用的是bkdrhash 法.也是最常用的冲突最少的一种.原理:把字符串和数值对应.这里用base=31(一般用质数), 先是扫一遍,处理处每个位子到结 ...

  2. hdu4821 字符串hash(有多少(M*L长的,M个不相同)子串))

    题意这英语..反正我是读不懂== 题意:给定一个串,有多少M*L的子串,其中子串的M个子串不相同= (注:某一位不相同即为不相同) 很明显要On的扫,但是似乎前一个与后一个没有关系?是的,前第x个(x ...

  3. 字符串Hash的原理与应用

    字符串Hash无论是在ACM竞赛中还是在工程中都有着广泛的应用,所以很有必要掌握好它的用法.主要分为两个部 分:Hash映射和冲突处理.而本文主要来详细讲解Hash映射的方法及应用,下篇文章将会介绍如 ...

  4. 字符串hash(二)

    从上一届已经讲了字符串hash的方法,hash后怎么用也很重要 文章目录 一.查询子串的hash值 查询子串减去期中一个字符后的hash值 查询两个子串拼接的hash值 **hash的模板(自然溢出) ...

  5. 字符串hash(一)

    很久没遇到过hash的题了,今天来重新温故一下 文章目录 序言 常用的几个字符串hash方法: hash公式(自然溢出) 讲解 模板 单hash 讲解 模板 双hash 讲解 代码 总结 序言 你有没 ...

  6. nssl1211-好文章【字符串hash,map】

    正题 题目大意 求长度为n个一个字符串长度为m不同的子串个数 解题思路 用字符串hash判断字符串是否相同,然后时间复杂度O(n2)O(n^2)O(n2),然后我们因为自然溢出所以不能开桶,那就开ma ...

  7. nssl1192-加密【字符串hash】

    正题 题目大意 对于每个字母都有一个加密后的字母对应. 然后给一段字母其中包括密文和密文对应的原文的一部分(也有可能没有原文),求一段最短的密文加原文. 解题思路 枚举密文和原文分界处.然后用字符串h ...

  8. UVA4671 K-neighbor substrings FFT+字符串hash

    题解: 将字符串A.B中的a和b分别以1和-1表示,对字符串B进行反转. 将A和B看成多项式,求卷积,这样的话从结果区间的[lenB−1,lenA)[lenB−1,lenA)[lenB-1,lenA) ...

  9. 【Codeforces - 127D】Password(思维,二分+字符串Hash)

    题干: Asterix, Obelix and their temporary buddies Suffix and Prefix has finally found the Harmony temp ...

最新文章

  1. sscanf实用功能简介
  2. 【大数据实时计算框架】Storm框架
  3. Android Studio 新建drawable-hdpi、drawable-mdpi等
  4. (视频+图文)机器学习入门系列-第9章 集成学习
  5. prfm预加载指令使用说明
  6. Zeppelin-源码编译
  7. iOS中js与objective-c的交互(转)
  8. 了解android应用开发的更多方面有更好的认识
  9. 医疗数据典型特征及架构发展方向研究
  10. JS 的引用赋值与传值赋值
  11. SQL Server中的查询优化技术:提示和技巧
  12. 5G冲击下,软件测试行业面临的新挑战和机遇
  13. nodeJS---URL相关模块用法(url和querystring)
  14. 华为 emui 刷机解锁及回锁教程
  15. 电路仿真软件用matlab,基于MATLAB的电路仿真软件设计.doc
  16. 网狐大联盟服务器环境搭建完整教程
  17. Java学习笔记分享之MyBatis篇(中)
  18. TypeError: object() takes no parameters
  19. kd树实现搜索的过程
  20. 打印任何年月的日历表(Java)

热门文章

  1. php html seo,浅谈HTML里的布局对于SEO的影响
  2. 支付宝API文档网址
  3. 【技术篇】日常网站App的用户登录,你懂了吗
  4. PMP项目管理理论介绍
  5. 安装并配置 quilt
  6. 求一维数组中的最大数c语言,C语言 求一维数组中最大值的位置
  7. 精准广告预算分桶背景分析
  8. Linux-FrameBuffer双缓冲机制显示图像
  9. 编写python程序、计算账户余额_小明有20w存款存在余额宝中,按余额宝年收益为2.35%计算,用Python编写程序计算,多少年后小明的存款达到30w?...
  10. 通用模型之-party model 学习笔记