Cod sursa(job #631420)

Utilizator sebii_cSebastian Claici sebii_c Data 7 noiembrie 2011 23:06:40
Problema Matrix Scor 60
Compilator c Status done
Runda Arhiva de probleme Marime 1 kb
#include <stdio.h>
#define NMAX 1024

char map[NMAX][NMAX], c;

int fw[NMAX][NMAX], bc[NMAX][NMAX], v[26];

int main()
{
    freopen("matrix.in", "r", stdin);
    freopen("matrix.out", "w", stdout);
    int n, m, i, j, k;
    char c;
    scanf("%d %d", &n, &m);
    for (i=1; i<=n; ++i) {
	getc(stdin);
	for (j=1; j<=n; ++j) {
	    scanf("%c", &map[i][j]);
	    map[i][j] -= 'a';
	}
    }
    
    for (i=1; i<=m; ++i) {
	for (j=1; j<=n; ++j) {
	    scanf("%c", &c);
	    ++v[c-'a'];
	}
    }
    
    for (k=0; k<26; ++k) {
	for (i=1; i<=n; ++i)
	    for (j=1; j<=n; ++j)
		fw[i][j] = fw[i-1][j] + fw[i][j-1] - fw[i-1][j-1] + (map[i][j] == k); 
	for (i=m; i<=n; ++i)
	    for (j=m; j<=n; ++j) {
		int val = fw[i][j] - fw[i-m][j] - fw[i][j-m] + fw[i-m][j-m];
		if (val != v[k])
		    bc[i][j] = 1;
	    }
    }

    int count=0;
    for (i=m; i<=n; ++i)
	for (j=m; j<=n; ++j)
	    count += (bc[i][j] == 1);
    printf("%d\n", (n-m+1)*(n-m+1)-count);
    return 0;
}