A2. Death Stars (medium) 哈希暴力

题目链接:http://codeforces.com/problemset/problem/958/A2

 

题意:

       给你一个n*m   s1和m*n   s2的二维字符数组,保证m<n,要你找到一个s1的行和s2的列,让这里往右(往下)的m列(行),相同,题目保证一定有解。

做法:

       基础的哈希题目,把行开始,列部分的数据哈希掉,然后比对就好了,这里要注意,要双哈希,否则容易有相同的情况。

少有的做一道哈希题,拓展知识面了当。。

 


#include<bits/stdc++.h>
#define mp(a,b) make_pair(a,b)
#define pb push_back
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int maxn=1010;
const int inf=0x3fffffff;
const ll mod1=217636919;
const ll mod2=917120411;
int n,m;
string s1[2005],s2[205];
ll ha1s1[2005],ha1s2[205][2005];
ll ha2s1[2005],ha2s2[205][2005];
ll hash1(string s){
    ll ret=0;
    for(int i=0;i<s.size();i++){
        ret=(ret*26+s[i]-'0')%mod1;
    }
    return ret;
}
ll hash2(string s){
    ll ret=0;
    for(int i=0;i<s.size();i++){
        ret=(ret*26+s[i]-'0')%mod2;
    }
    return ret;
}
int ck(int x,int y){
    for(int i=0;i<m;i++){
        if(ha1s1[x+i]!=ha1s2[i+1][y]||ha2s1[x+i]!=ha2s2[i+1][y]) return 0;
    }
    return 1;
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) cin>>s1[i];
    for(int i=1;i<=m;i++) cin>>s2[i];

    for(int i=1;i<=n;i++){
        ha1s1[i]=hash1(s1[i]);
        ha2s1[i]=hash2(s1[i]);
    }
    for(int i=1;i<=m;i++){
        for(int j=1;j<=n-m+1;j++){
            ha1s2[i][j]=hash1(s2[i].substr(j-1,m));
            ha2s2[i][j]=hash2(s2[i].substr(j-1,m));
        }
    }
    for(int i=1;i<=n-m+1;i++){
        for(int j=1;j<=n-m+1;j++){
            if(ck(i,j)){
                printf("%d %d\n",i,j);
                return 0;
            }
        }
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值