CodeForces - 958A2(二维hash)

标签: ACM Codeforces
2人阅读 评论(0) 收藏 举报
分类:

链接:CodeForces - 958A2

题意:给出N*M和M*N的两个矩阵,要求在两个矩阵中找出M*M的相同部分。

题解:二维hash模板

#include <bits/stdc++.h>
using namespace std;

const int maxn = 200;
int N, M;
char a[maxn][maxn], b[maxn][maxn];
unsigned long long ha[maxn][maxn], hb[maxn][maxn], tmp[maxn][maxn];

void CalcHash(unsigned long long h[][maxn], char a[][maxn], int n, int m)
{
    const unsigned long long B1 = 9973;
    const unsigned long long B2 = 1e8 + 7;

    unsigned long long t1 = 1;
    for(int j = 0; j < M; j++) t1 *= B1;

    for(int i = 0; i < n; i++){
        unsigned long long e = 0;
        for(int j = 0; j < M; j++) e = e * B1 + a[i][j];

        for(int j = 0; j + M <= m; j++){
            tmp[i][j] = e;
            if(j + M < m) e = e * B1 - t1 * a[i][j] + a[i][j + M];
        }
    }

    unsigned long long t2 = 1;
    for(int i = 0; i < M; i++) t2 *= B2;

    for(int j = 0; j + M <= m; j++){
        unsigned long long e = 0;
        for(int i = 0; i < M; i++) e = e * B2 + tmp[i][j];

        for(int i = 0; i + M <= n; i++){
            h[i][j] = e;
            if(i + M < n) e = e * B2 - t2 * tmp[i][j] + tmp[i + M][j];
        }
    }

}

void Find(int& x, int& y)
{
    for(int i = 0; i + M <= N; i++){
        for(int j = 0; j + M <= N; j++){
            if(ha[i][0] == hb[0][j]){
                x = i + 1;
                y = j + 1;
                return ;
            }
        }
    }
}

int main()
{
    scanf("%d%d", &N, &M);
    for(int i = 0; i < N; i++) scanf("%s", a[i]);
    for(int i = 0; i < M; i++) scanf("%s", b[i]);

    CalcHash(ha, a, N, M);
    CalcHash(hb, b, M, N);

    int x = 0, y = 0;
    Find(x, y);

    printf("%d %d\n", x, y);

    return 0;
}

查看评论

perl中二维哈希的使用

使用$hash{$key1}{$key2} = $value;遍历(注意加粗与加下划线的语句)foreach my $key1 (keys %hash){        my $hash2 = $...
  • uncletuu
  • uncletuu
  • 2010-03-19 10:39:00
  • 1814

Perl – 遍历二维Hash

转自:UncleTuu’s Tech Notes 使用 $hash{$key1}{$key2} = $value; 遍历(注意加粗与加下划线的语句) foreach my $key1 (...
  • mydriverc2
  • mydriverc2
  • 2013-11-20 18:43:47
  • 5273

URAL 1486(二维字符串hash)

题意:一个最大500*500的字符矩阵,求最大的两个相同的字符正方形。正方形可以有重叠部分但不能重合。 解法:首先是二分正方形的长度,然后判断某个长度存在时候计算字符矩阵的二维hash值,二...
  • xiefubao
  • xiefubao
  • 2014-11-17 17:49:30
  • 1126

bzoj2462(矩阵二维hash)……不会的题就hash

实际上,就是横着hash一次,再竖着hash一次,注意横竖的base不能相同 冲突是难以避免的 取一个矩阵的hash a[i][j]- a[i][j-mm]*qb1[mm]- a[i-nn][...
  • zhhx2001
  • zhhx2001
  • 2016-08-09 11:07:43
  • 517

Codeforces 113B Petr# 字符串hash

题目链接:点击打开链接 #include #include #include #include using namespace std; typedef unsigned long ...
  • qq574857122
  • qq574857122
  • 2014-09-05 16:57:29
  • 1199

codeforces 855C 树DP

简略题意:给出一颗树,有m种颜色,第k种颜色是特殊颜色,树上最多有x个特殊颜色点。 你需要把整个树染色,且保证特殊颜色节点以下条件: 1. 与其相连的不能有特殊颜色节点。 2. 与其相连的节点的...
  • meopass
  • meopass
  • 2017-09-26 10:48:00
  • 728

Codeforces667c dp

Problem:记忆化搜索 题意:这题坑点就是题意,要求的是不能连续出现两个相同的后缀串. 分析: 定义dp[pos][j][k]dp[pos][j][k]为当前在pospos位置,当前要走jj...
  • jibancanyang
  • jibancanyang
  • 2016-05-01 21:59:31
  • 383

CodeForces 687C - The Values You Can Make(01背包dp)

题意:给定n(1 一维表示总额,二维表示能否由一维的总额得出此额度。 假如枚举到的硬币面值为 t ,如果存在dp[ i - t ] [ j ] = true,那么有 1、dp[ i ] [ j ...
  • TianTengtt
  • TianTengtt
  • 2016-07-11 23:52:14
  • 642

Codeforces 798D Mike and distribution(二维贪心)

D. Mike and distribution time limit per test 2 seconds memory limit per test 256 megabytes inp...
  • Yasola
  • Yasola
  • 2017-04-22 22:45:47
  • 946
    个人资料
    持之以恒
    等级:
    访问量: 2533
    积分: 362
    排名: 21万+
    文章存档
    最新评论