字符创匹配(Rabin-Karp 算法)(hash)
2016-07-26 20:30
351 查看
<span style="font-size:18px;">//题目链接:http://poj.org/problem?id=3690 //复杂度:如果一一检查,会退化为O(mn) 不同字符串哈希值冲突的概率非常低, //通常可以忽视,实际不做朴素的检查,所以是O(m+n)。 //哈希函数:H(C)=(c1*pow(b,m-1)+c2*pow(b,m-2)+c3*pow(b,m-3)+...+cm*pow(b,0))mod h.(b为哈希的基数) //递推:H(S[k+1...k+m])=( H(S[k...k+m-1])*b-sk*pow(b,m)+sk+m )mod h //取h=pow(2,64),用自然溢出省去模运算 #include <iostream> #include <cstdio> #include <cstring> #include <set> using namespace std; typedef unsigned long long ull; const int maxn=1005,maxt=105; const ull b1=9973,b2=100000007; ull tmp[maxn][maxn],Hash[maxn][maxn]; char field[maxn][maxn],model[maxt][maxn][maxn]; multiset<ull> mul; int P,Q; void solve(char M[maxn][maxn],int r,int c) { int i,j; ull t=1,e; for(i=0;i<Q;i++)t*=b1; for(i=0;i<r;i++) { e=0; for(j=0;j<Q;j++) { e=e*b1+M[i][j]; } for(j=0;j+Q<=c;j++) { tmp[i][j]=e; if(j+Q<c) { e=e*b1-M[i][j]*t+M[i][j+Q]; } } } t=1; for(i=0;i<P;i++)t*=b2; for(i=0;i<c-Q+1;i++) { e=0; for(j=0;j<P;j++) { e=e*b2+tmp[j][i]; } for(j=0;j+P<=r;j++) { Hash[j][i]=e; if(j+P<r) { e=e*b2-tmp[j][i]*t+tmp[j+P][i]; } } } } int main() { int N,M,T,i,j,kase=1; while(scanf("%d%d%d%d%d",&N,&M,&T,&P,&Q)!=EOF) { mul.clear(); if(N==0 && M==0 && T==0 && P==0 && Q==0)break; getchar(); for(i=0;i<N;i++) scanf("%s",field[i]); for(i=0;i<T;i++) { getchar(); for(j=0;j<P;j++) { scanf("%s",model[i][j]); } } for(i=0;i<T;i++) { solve(model[i],P,Q); mul.insert(Hash[0][0]); } solve(field,N,M); for(i=0;i<N-P+1;i++) { for(j=0;j<M-Q+1;j++) { mul.erase(Hash[i][j]); } } printf("Case %d: %d\n",kase++,T-mul.size()); } return 0; } </span>
相关文章推荐
- NOIP 2008 - 普及组 排座椅 贪心 重庆一中高2018级竞赛班第五次测试 2016.7.26 Problem 2
- C++11学习的几个链接
- LINUX入门基础
- StringBuffer
- Ubuntu上搭建samba服务器并远程挂载
- Java 理论与实践: 正确使用 Volatile 变量
- ACM推荐网站 博客
- idea 创建的maven+spring+mybatis项目整合 报错无法创建bean
- 使用redis生成数据库主键自增
- Android Studio 导入Eclipse的项目后,注释出现乱码问题的解决
- 根据日期 为上传文件生成唯一的名字
- eclipse报错:Workspace at 'C:/P/eclipse/workspace' in use or cannot be created, choose a different one
- paper 92:图像视觉博客资源2之MIT斯坦福CMU
- Android 在 SElinux下 如何获得对一个内核节点的访问权限
- hdu1907 John (尼姆博弈)
- R语言|关联规则挖掘|可视化
- 字符串匹配——Sunday算法
- hdu 5762 Teacher Bo(鸽巢原理)
- linux基础学习-第三天记录
- Java 之 线程的生命周期(三)