UvaLive6893_The_Big_Painting

(有任何问题欢迎留言或私聊 && 欢迎交流讨论哦

Catalog

Problem:传送门

Portal

 原题目描述在最下面。

 给你两个二维矩阵,问第一个矩阵在第二个矩阵中的出现次数。


Solution:

二维hash:

 直接二维矩阵hash,枚举求值即可。注意横纵base值不要取相同。枚举的时候注意一些小细节。

hash+Kmp:

 一维hash,把一个矩阵hash成一维序列。然后另一位维Kmp判断出现次数。


AC_Code:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
typedef unsigned long long uLL;

const uLL base1 = 1572872831;
const uLL base2 = 1971536491;
const int MXN = 2005;
int n1, n2, m1, m2;
char ar[MXN][MXN], br[MXN][MXN];
uLL cr[MXN][MXN];
int solve(int n1,int m1,int n2,int m2) {
    int cnt = 0;
    uLL ans1 = 0, tmp, pw1 = 1, pw2 = 1;
    for(int i = 1; i <= m1; ++i) pw1 = pw1 * base1;
    for(int i = 1; i <= n1; ++i) {
        tmp = 0;
        pw2 = pw2 * base2;
        for(int j = 1; j <= m1; ++j) {
            tmp = tmp * base1 + ar[i][j];
        }
        ans1 = ans1 * base2 + tmp;
    }//ans1是第一个矩阵的hash值
    for(int i = 1; i <= n2; ++i) {
        for(int j = 1; j <= m1; ++j) {
            cr[i][j] = cr[i][j-1] * base1 + br[i][j];
        }
        for(int j = m1+1; j <= m2; ++j) {//预处理第i行第j个字母前m1的字母的一维hash值
            cr[i][j] = cr[i][j-1] * base1 + br[i][j] - br[i][j-m1]*pw1;
        }
    }
    for(int j = m1; j <= m2; ++j) {//枚举列
        tmp = 0;
        for(int i = 1; i <= n1; ++i) tmp = tmp * base2 + cr[i][j];
        if(tmp == ans1) cnt++;
        for(int i = n1 + 1; i <= n2; ++i) {//维持长度为n1
            tmp = tmp * base2 + cr[i][j] - cr[i-n1][j]*pw2;
            if(tmp == ans1) cnt++;
        }
    }
    return cnt;
}
int main(){
    while(~scanf("%d%d%d%d", &n1, &m1, &n2, &m2)){
        for(int i = 1; i <= n1; ++i) scanf("%s", ar[i]+1);
        for(int i = 1; i <= n2; ++i) scanf("%s", br[i]+1);
        printf("%d\n", solve(n1,m1,n2,m2));
    }
    return 0;
}
/*
4 4 10 10
oxxo
xoox
xoox
oxxo
xxxxxxoxxo
oxxoooxoox
xooxxxxoox
xooxxxoxxo
oxxoxxxxxx
ooooxxxxxx
xxxoxxoxxo
oooxooxoox
oooxooxoox
xxxoxxoxxo
*/


Problem Description:

Samuel W. E. R. Craft is an artist with a growing reputation.
Unfortunately, the paintings he sells do not provide
him enough money for his daily expenses plus the new supplies
he needs. He had a brilliant idea yesterday when he
ran out of blank canvas: ”Why don’t I create a gigantic
new painting, made of all the unsellable paintings I have,
stitched together?”. After a full day of work, his masterpiece
was complete.
That’s when he received an unexpected phone call: a
client saw a photograph of one of his paintings and is willing
to buy it now! He had forgotten to tell the art gallery to
remove his old works from the catalog! He would usually
welcome a call like this, but how is he going to find his old
work in the huge figure in front of him?
Given a black-and-white representation of his original
painting and a black-and-white representation of his masterpiece, can you help S.W.E.R.C. identify in
how many locations his painting might be?
Input
The input file contains several test cases, each of them as described below.
The first line consists of 4 space-separated integers: hp wp hm wm, the height and width of the
painting he needs to find, and the height and width of his masterpiece, respectively.
The next hp lines have wp lower-case characters representing his painting. After that, the next hm
lines have wm lower-case characters representing his masterpiece. Each character will be either ‘x’ or
‘o’.
Constraints:
1 ≤ hp, wp ≤ 2 000
1 ≤ hm, wm ≤ 2 000
hp ≤ hm
wp ≤ wm
Output
For each test case, output a single integer representing the number of possible locations where his
painting might be, on a line by itself.
Sample Output Explanation
The painting could be in four locations as shown in the following picture. Two of the locations overlap.
Sample Input
4 4 10 10
oxxo
xoox
xoox
oxxo
xxxxxxoxxo
oxxoooxoox
xooxxxxoox
xooxxxoxxo
oxxoxxxxxx
ooooxxxxxx
xxxoxxoxxo
oooxooxoox
oooxooxoox
xxxoxxoxxo
Sample Output
4

转载于:https://www.cnblogs.com/Cwolf9/p/9774654.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值