POJ - 3690 Constellations #include<cstdio> #include<vector> #include<set> using namespace std; typedef unsigned long long ULL; const int N = 1010, M = N * N, P = 131; ULL hashv[N][N],p[M]; char str[N]; ULL calc(ULL f[],int l,int r) { return f[r]-f[l-1]*p[r-l+1]; } int main() { p[0]=1; for(int i=1;i<=1000001;i++) p[i]=p[i-1]*P; int n,m,a,b,q,T=1; while(scanf("%d%d%d%d%d",&n,&m,&q,&a,&b)!=EOF) { if(n==0&&m==0&&a==0&&b==0&&q==0) break; for(int i=1;i<=n;i++) { scanf("%s",str+1); for(int j=1;j<=m;j++) hashv[i][j]=hashv[i][j-1]*P+str[j]; } multiset<ULL> S; for(int k=1;k<=q;k++) { ULL s=0; for(int i=0;i<a;i++) { scanf("%s",str); for (int j=0;j<b;j++) s=s*P+str[j]; } S.insert(s); } for(int i=b;i<=m;i++) { ULL s=0; int l=i-b+1,r=i; for(int j=1;j<=n;j++) { s=s*p[b]+calc(hashv[j],l,r); if(j-a>0) s-=calc(hashv[j-a],l,r)*p[a*b]; if(j>=a) S.erase(s); } } printf("Case %d: %d\n",T++,q-(int)S.size()); } return 0; }