Reference: http://blog.csdn.net/popoqqq/article/details/41084047
#include <cstdio> #include <cstring>using namespace std;typedef unsigned long long ull;int n,m,a,b,q;const ull seed1=17,seed2=19, #define MOD 1000001ull V[mod],sum[1001][1001],ord[201],pow1[1001],pow2[1001];char s[1001][ 1001];int first[mod],next[mod],en;void Insert (const ull &v) {int u= (int) (V%MOD); v[en]=v;next[en]=first[u];first[ u]=en++;} int main () {scanf ("%d%d%d%d", &n,&m,&a,&b); Memset (first,-1,sizeof (first)); ord[' 0 ']=1,ord[' 1 ']=2; for (int i=1;i<=n;++i) scanf ('%s ', s[i]+1), for (int i=1;i<=n;++i) for (int j=1;j<=m;++j) SUM[I][J]=ORD[S[I][J]] +sum[i-1][j]*seed1;for (int i=1;i<=n;++i) for (int j=1;j<=m;++j) sum[i][j]+=sum[i][j-1]*seed2;pow1[0]=pow2[0]=    1;    for (int i=1;i<=n;i++) pow1[i]=pow1[i-1]*seed1;    for (int i=1;i<=m;i++) pow2[i]=pow2[i-1]*seed2; for (int i=a;i<=m;i++) for (int j=b;j<=n;j++) Insert (sum[i][j]-sum[i-a][j]*pow1[a]-sum[i][j-b]*pow2[b]+sum[i-a      ][J-B]*POW1[A]*POW2[B]); scanf ("%d", &q); for (; q;--q) {    for (int i=1;i<=a;i++) scanf ("%s", s[i]+1);          for (int i=1;i<=a;i++) for (int j=1;j<=b;j++) sum[i][j]=ord[s[i][j]]+sum[i-1][j]*seed1;        for (int i=1;i<=a;i++) for (int j=1;j<=b;j++) sum[i][j]+=sum[i][j-1]*seed2;        int o= (int) (SUM[A][B]%MOD);        For (int. I=first[o];i!=-1;i=next[i]) if (V[i]==sum[a][b]) {puts ("1"); goto out;} Puts ("0");      Out:; } return 0;}
 Character Matrix Hash bzoj2351 [Beijing2011]matrix