题目链接: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;
}