POJ 3690 找星座(2D匹配)(未解答)

文章目录

    • 1. 题目信息
      • 1.1 题目链接
      • 1.2 题目大意
      • 1.3 解题思路
    • 2. 代码
      • 2.1 Time Limit Exceeded 代码
      • 2.2 Time Limit Exceeded 代码
      • 2.3 Time Limit Exceeded 代码

1. 题目信息

1.1 题目链接

http://poj.org/problem?id=3690

1.2 题目大意

给定大的矩阵(天空的样子),然后给定若干小矩阵(可能的天空的一角)
求有多少个小矩阵是从大矩阵里抠出来的(2D匹配)

1.3 解题思路

采用RK算法,求矩阵的哈希值,看哈希值是否一样,若一样,再比较一下看是否真的一样(防止哈希冲突)

2. 代码

2.1 Time Limit Exceeded 代码

在这里插入图片描述
计算的是整体矩阵的哈希值

/*** @description: poj3690 2维矩阵匹配* @author: michael ming* @date: 2019/6/25 19:47* @modified by: */
#include <iostream>
#include <math.h>
using namespace std;
int a[1001][1001];
int b[51][51];
typedef unsigned long long ull;
ull cal_hash_b(int r, int c, int b[][51])
{int i, j, k;ull value = 0;for (i = 0; i < r; ++i) //计算2d模式串的hash值value{for(j = 0, k = 1; j < c; ++j,++k)value += b[i][j]*pow(2.0,k);}return value;
}
ull cal_hash_a_child(int i0, int j0, int r, int c, int a[][1001])
{int i, j, k;ull hash_value = 0;for (i = i0; i < r; ++i) //计算2d子串的hash值value{for(j = j0, k = 1; j < c; ++j,++k)hash_value += a[i][j]*pow(2.0,k);}return hash_value;
}
bool same(int a[][1001], int b[][51], int i0, int j0, int mr, int mc)
{int x = i0, y = j0, i, j;for(i = 0; i < mr; ++i,++x){for(j = 0, y = j0; j < mc; ++j,++y)//记得写y=j0,换行后y复位{if(a[x][y] != b[i][j])return false;}}return true;
}
int str_RK_2d(int a[][1001], int nr, int nc, int b[][51], int mr, int mc)//s是主串,t是模式串
{int i, j;ull hash_val, value;value = cal_hash_b(mr,mc,b);//计算2d模式串哈希值for(i = 0; i < nr-mr+1; ++i)//行最多nr-mr+1次比较{for(j = 0; j < nc-mc+1; ++j)//列最多nc-mc+1次比较{hash_val = cal_hash_a_child(i,j,mr+i,mc+j,a);//计算2d子串哈希值if(hash_val == value && same(a,b,i,j,mr,mc)){//如果2d子串哈希值等于模式串的,且"真的"字符串匹配(避免冲突带来的假匹配)return 1;}}}return 0;
}
void creatMatrix_a(int a[][1001], int r, int c)
{int i, j;char ch;for(i = 0; i < r; ++i)for(j = 0; j < c; ++j){cin >> ch;if(ch == '*')a[i][j] = 1;elsea[i][j] = 0;}
}
void creatMatrix_b(int b[][51], int r, int c)
{int i, j;char ch;for(i = 0; i < r; ++i)for(j = 0; j < c; ++j){cin >> ch;if(ch == '*')b[i][j] = 1;elseb[i][j] = 0;}
}
int main()
{int N, M, T, P, Q, count, ID = 1;while(cin >> N >> M >> T >> P >> Q && N){count = 0;creatMatrix_a(a,N,M);while(T--){creatMatrix_b(b,P,Q);count += str_RK_2d(a,N,M,b,P,Q);}cout << "Case " << ID++ << ": " << count << endl;}return 0;
}

2.2 Time Limit Exceeded 代码

优化了哈希值的计算方式,采用错位乘以2的方式,2的k次幂提前算好(还试了改成位运算),都是超时

/*** @description: poj3690 2维矩阵匹配* @author: michael ming* @date: 2019/6/25 19:47* @modified by:*/
#include <iostream>
using namespace std;
typedef unsigned long long ull;
int a[1001][1001];
int b[51][51];
ull cal_hash_b(int r, int c, int b[][51])
{int i, j, k;ull value = 0;for (i = 0; i < r; ++i) //计算2d模式串的hash值value{for(j = 0, k = c-1; j < c; ++j,--k){value += b[i][j]<<k;}}return value;
}
ull cal_hash_a_child(int i0, int j0, int r, int c, int a[][1001])
{int i, j, k;ull hash_value = 0;for (i = i0; i < r; ++i) //计算2d子串的hash值value{for(j = j0, k = c-1; j < c; ++j,--k)hash_value += a[i][j]<<k;}return hash_value;
}
bool same(int a[][1001], int b[][51], int i0, int j0, int mr, int mc)
{int x = i0, y = j0, i, j;for(i = 0; i < mr; ++i,++x){for(j = 0, y = j0; j < mc; ++j,++y)//记得写y=j0,换行后y复位{if(a[x][y] != b[i][j])return false;}}return true;
}
int sum(int a[][1001], int i0, int j0, int mr)
{int sum = 0;for(int x = 0; x < mr; ++x,++i0)sum += a[i0][j0];return sum;
}
int str_RK_2d(int a[][1001], int nr, int nc, int b[][51], int mr, int mc)//s是主串,t是模式串
{int i, j;ull hash_val, value;value = cal_hash_b(mr,mc,b);//计算2d模式串哈希值for(i = 0; i < nr-mr+1; ++i)//行最多nr-mr+1次比较{for(j = 0; j < nc-mc+1; ++j)//列最多nc-mc+1次比较{if(j == 0)hash_val = cal_hash_a_child(i,j,mr+i,mc+j,a);//计算2d子串哈希值elsehash_val = ((hash_val-(sum(a,i,j,mr)<<(mc-1)))<<1) + sum(a,i,j+mc-1,mr);if(hash_val == value && same(a,b,i,j,mr,mc)){//如果2d子串哈希值等于模式串的,且"真的"字符串匹配(避免冲突带来的假匹配)return 1;}}}return 0;
}
void creatMatrix_a(int a[][1001], int r, int c)
{int i, j;char ch;for(i = 0; i < r; ++i)for(j = 0; j < c; ++j){cin >> ch;if(ch == '*')a[i][j] = 1;elsea[i][j] = 0;}
}
void creatMatrix_b(int b[][51], int r, int c)
{int i, j;char ch;for(i = 0; i < r; ++i)for(j = 0; j < c; ++j){cin >> ch;if(ch == '*')b[i][j] = 1;elseb[i][j] = 0;}
}
int main()
{int N, M, T, P, Q, count, ID = 1;while(cin >> N >> M >> T >> P >> Q && N){count = 0;creatMatrix_a(a,N,M);while(T--){creatMatrix_b(b,P,Q);count += str_RK_2d(a,N,M,b,P,Q);}cout << "Case " << ID++ << ": " << count << endl;}return 0;
}

2.3 Time Limit Exceeded 代码

改为计算每行的哈希值,把大矩阵的所有小矩阵的宽度的每行哈希值算出来,后面开始逐行比较,有不符合的,跳出,寻找下一个,还是超时

/*** @description: poj3690 2维矩阵匹配* @author: michael ming* @date: 2019/6/25 19:47* @modified by:*/
#include <time.h>
#include <stdio.h>
typedef unsigned long long ull;
int a[1001][1001];
int b[51][51];
ull hash_b[51];//存放每行的哈希值,每行相当于一个2进制数
ull hash_a[1001][1001];//存放主串子串的哈希值void cal_hash_b(int r, int c, int b[][51])
{int i, j, k;ull value;for (i = 0; i < r; ++i) //计算2d模式串的hash值value{value = 0;for(j = 0, k = c-1; j < c; ++j,--k){value += b[i][j]<<k;}hash_b[i] = value;}return;
}
void cal_hash_a_child(int N, int M, int a[][1001], int P, int Q)
{int i, j, k, x;ull hash_value;for (i = 0; i < N; ++i) //计算2d子串的每行的hash值{for(j = 0; j < M-Q+1; ++j){if(j == 0){hash_value = 0;for(x = j, k = Q-1; x < j+Q && k >= 0; ++x,--k)hash_value += a[i][x]<<k;}elsehash_value = ((hash_a[i][j-1]-(a[i][j-1]<<(Q-1)))<<1)+a[i][j+Q-1];hash_a[i][j] = hash_value;}}
}int str_RK_2d(int a[][1001], int N, int M, int b[][51], int P, int Q)//s是主串,t是模式串
{int i, j, k, x;bool flag = false;cal_hash_b(P,Q,b);//计算2d模式串每行哈希值for(j = 0; j < M-Q+1; ++j)//列最多nc-mc+1次比较,分别比较每行,列先固定{for(i = 0; i < N-P+1; ++i){//行最多nr-mr+1次比较for(x = i, k = 0; x < i+P && k < P; ++x,++k){//一组比较P行if(hash_a[x][j] == hash_b[k])//比较子串哈希值flag = true;else{flag = false;break;}}if(flag == true)return 1;}}return 0;
}
void creatMatrix_a(int a[][1001], int r, int c)
{int i, j;char ch;for(i = 0; i < r; ++i)for(j = 0; j < c; ++j){ch = getchar();while(ch == ' '||ch == '\n')ch = getchar();if(ch == '*')a[i][j] = 1;elsea[i][j] = 0;}
}
void creatMatrix_b(int b[][51], int r, int c)
{int i, j;char ch;for(i = 0; i < r; ++i)for(j = 0; j < c; ++j){ch = getchar();while(ch == ' '||ch == '\n')ch = getchar();if(ch == '*')b[i][j] = 1;elseb[i][j] = 0;}
}
int main()
{
//    clock_t start, finish;
//    start = clock();int N, M, T, P, Q, count, ID = 1;while((scanf("%d%d%d%d%d",&N,&M,&T,&P,&Q)!=EOF) && N){count = 0;creatMatrix_a(a,N,M);cal_hash_a_child(N,M,a,P,Q);while(T--){creatMatrix_b(b,P,Q);count += str_RK_2d(a,N,M,b,P,Q);}printf("Case %d: %d\n",ID++,count);}
//    finish = clock();
//    cout << "takes "<< finish-start << " ms." << endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/480195.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

综述 | 事件抽取及推理 (上)

本文转载自公众号&#xff1a;知识工场。 事件概要事件是一种重要的知识&#xff0c;近年来&#xff0c;越来越多的工作关注于从开放域或领域文本中抽取结构化事件知识。同时&#xff0c;除了本身就很困难的…

下载 | 李宏毅:1 天搞懂深度学习,我总结了 300 页 PPT

《1 天搞懂深度学习》&#xff0c;300 多页的 ppt&#xff0c;台湾李宏毅教授写的&#xff0c;非常棒。不夸张地说&#xff0c;是我看过最系统&#xff0c;也最通俗易懂的&#xff0c;关于深度学习的文章。这份 300 页的 PPT&#xff0c;被搬运到了 SlideShare 上&#xff0c;下…

史上最全Redis面试49题(含答案):哨兵+复制+事务+集群+持久化等

最全面试题答案系列 史上最强多线程面试44题和答案&#xff1a;线程锁线程池线程同步等 最全MySQL面试60题和答案 史上最全memcached面试26题和答案 史上最全Spring面试71题与答案 今天主要分享redis最全答案系列 Redis主要有哪些功能&#xff1f; 1.哨兵&#xff08;Sen…

DTW动态时间规整算法

原文地址&#xff1a;https://blog.csdn.net/qcyfred/article/details/53824507 https://zhuanlan.zhihu.com/p/43247215 动态时间规整&#xff08;DTW&#xff09;算法简介相忘天涯&#xff0c;深藏于心19 人赞同了该文章DTW最初用于识别语音的相似性。我们用数字表示音调高低…

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

文章目录1. 题目1.1 题目链接1.2 题目大意2. Accepted代码2.1 KMP解法2.2 哈希法&#xff08;有推导过程&#xff09;1. 题目 1.1 题目链接 http://poj.org/problem?id3461 类似题目&#xff1a;LeetCode 30. 串联所有单词的子串&#xff08;字符串哈希&#xff09; 1.2 题…

莫比乌斯:百度凤巢下一代广告召回系统

星标/置顶小屋&#xff0c;带你解锁最萌最前沿的NLP、搜索与推荐技术文 | 江城编 | 夕小瑶今天聊聊百度在最顶级的数据挖掘会议KDD2019的计算广告track上提出的query-ad匹配模型——莫比乌斯&#xff08;MOBIUS&#xff09;。这也是百度凤巢下一代广告召回系统的内部代号&#…

当知识图谱遇上推荐系统之MKR模型(论文笔记三)

Multi-Task Feature Learning for Knowledge Graph Enhanced Recommendation 类别&#xff1a;交替学习 将知识图谱特征学习和推荐算法视为两个分离但又相关的任务&#xff0c;使用多任务学习的框架进行交替学习。 1、背景 MKR是一个通用的、端对端的深度推荐框架&#xf…

关于话题演化关系网络生成的路线思考:从话题聚类到话题网络展示

话题演化关系网络生成&#xff0c;是实现事件演化追踪的一个重要方法。通过对文本话题进行聚类、内容处理、话题演化关联、话题演化网络的展示&#xff0c;能够在一定程度上为用户揭示出一个事件发展的情况。本文就笔者对该方向的实现路线思考进行总结&#xff0c;分享给大家。…

综述 | 事件抽取及推理 (下)

本文转载在公众号&#xff1a;知识工场 。 上篇事件抽取及推理的推文已经介绍了事件抽取的基本方法&#xff0c;本篇主要介绍事件推理的相关工作。就目前来看&#xff0c;事件方向相关的研究还是以事件抽取为主流任务&#xff0c;当前大多都是在模型的框架和优化方面进行研究。…

Redis系列教程(三):如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题

Java相关的面试都会问到缓存的问题&#xff1a;史上最全Redis面试49题&#xff08;含答案&#xff09;:哨兵复制事务集群持久化等&#xff0c;除此之外还会问到缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等不常见的问题&#xff0c;但却是非常重要的问题&#xff0c;今…

随机森林:提供银行精准营销解决方案

原文地址&#xff1a;https://blog.csdn.net/weixin_34233679/article/details/88480912 本例是根据科赛网练习赛进行练手&#xff0c;学习巩固一下随机森林建模以及应用。 赛题描述本练习赛的数据&#xff0c;选自UCI机器学习库中的「银行营销数据集(Bank Marketing Data Set)…

谁说2021届秋招算法岗一定要灰飞烟灭啦?

没错&#xff0c;这是一碗鸡汤&#xff0c;希望肝完这碗鸡汤的师弟师妹们就不要过度焦虑啦&#xff5e;理性上车&#xff0c;理性下车&#xff0c;希望萌新们都能遇到最适合自己的坑位2014年末入坑AI&#xff0c;一路见证了AI行业的快速起飞、爆炸、焦虑和冷却。小夕前几天在知…

论文浅尝 | 基于深度强化学习的远程监督数据集的降噪

论文链接&#xff1a;https://arxiv.org/pdf/1805.09927.pdf来源&#xff1a;ACL2018Motivation&#xff1a;远程监督是以一种生成关系抽取训练样本的方法&#xff0c;无需人工标注数据。但是远程监督引入了噪音&#xff0c;即存在很多的假正例。本文的出发点非常简单&#xff…

字符串匹配算法(AC自动机 Aho-Corasick)

文章目录1. 多模式串匹配2. 经典多模式串匹配--AC自动机2.1 AC自动机构建2.2 在AC自动机上匹配主串2.3 复杂度分析3. python包1. 多模式串匹配 前面学的BF、RK、BM、KMP都是单模式串匹配算法&#xff08;一个模式串&#xff0c;一个主串&#xff09;多模式串匹配&#xff0c;即…

Redis系列教程(五):Redis哨兵、复制、集群的设计原理,以及区别

前一篇文章高并发架构系列&#xff1a;Redis为什么是单线程、及高并发快的3大原因详解谈了Redis高并发快的3个原因&#xff0c;本篇主要谈Redis的高可用&#xff0c;两篇合起来就可以把redis的高并发和高可用搞清楚了。 谈到Redis服务器的高可用&#xff0c;如何保证备份的机器…

论文浅尝 | 区分概念和实例的知识图谱嵌入方法

链接&#xff1a;https://arxiv.org/pdf/1811.04588.pdf知识图谱的表示学习最近几年被广泛研究&#xff0c;表示学习的结果对知识图谱补全和信息抽取都有很大帮助。本文提出了一种新的区分概念和实例的知识图谱表示学习方法&#xff0c;将上下位关系与普通的关系做了区分&#…

写在校招季,谈谈机器学习岗的Offer选择问题

星标/置顶小屋&#xff0c;带你解锁最萌最前沿的NLP、搜索与推荐技术文 | 吴海波 现在校招开始的越来越早&#xff0c;今年的实习生招聘还是异常火爆&#xff0c;简历一堆&#xff0c;而且是越来越没有区分度&#xff0c;以前面个xgboost的论文细节&#xff0c;就能区分很多人&…

Redis系列教程(六):Redis缓存和MySQL数据一致性方案详解

需求起因 在高并发的业务场景下&#xff0c;数据库大多数情况都是用户并发访问最薄弱的环节。所以&#xff0c;就需要使用redis做一个缓冲操作&#xff0c;让请求先访问到redis&#xff0c;而不是直接访问MySQL等数据库。 这个业务场景&#xff0c;主要是解决读数据从Redis缓存…

贪心算法(Greedy Algorithm)之霍夫曼编码

文章目录1. 贪心算法2. 应用2.1 找零钱2.2 区间覆盖2.3 霍夫曼编码霍夫曼编码完整代码1. 贪心算法 我们希望在一定的限制条件下&#xff0c;获得一个最优解每次都在当前的标准下做出当下最优决策&#xff08;整体不一定最优&#xff09;&#xff0c;做出的决策不可以后悔&…

数据结构中基本查找算法总结

原文地址&#xff1a;https://www.cnblogs.com/xuzhp/p/4638937.html 基本查找算法 一、查找的基本概念 查找&#xff0c;也可称检索&#xff0c;是在大量的数据元素中找到某个特定的数据元素而进行的工作。查找是一种操作。 二、顺序查找 针对无序序列的一种最简单的查找方式…