Cod sursa(job #380066)

Utilizator Addy.Adrian Draghici Addy. Data 4 ianuarie 2010 18:43:10
Problema Matrix Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <stdio.h>
#define Mmax 1010

char A[Mmax][Mmax], OK[Mmax][Mmax], x;
int V[Mmax][Mmax], L[Mmax], FR[150], M, N, i, j, T, t, sol;

int main() {
	
	FILE *f = fopen("matrix.in", "r");
	FILE *g = fopen("matrix.out", "w");
	
	fscanf(f, "%d %d\n", &M, &N);
	
	for (i = 1; i <= M; i++) {
		for (j = 1; j <= M; j++) {
			fscanf(f, "%c", &A[i][j]);
			OK[i][j] = 1;
		}
		fscanf(f, "\n");
	}
	
	for (i = 1; i <= N; i++) {
		for (j = 1; j <= N; j++) {
			fscanf(f, "%c", &x);
			FR[x]++;
			L[++T] = x;
		}
		fscanf(f, "\n");
	}
	
	//V[i][j] = de cate ori apare litera curenta in matricea [1][1] ... [i][j]
	for (t = 1; t <= T; t++)
		for (i = 1; i <= M; i++)
			for (j = 1; j <= M; j++) {
				V[i][j] = V[i-1][j] + V[i][j-1] - V[i-1][j-1] + (L[t] == A[i][j] ? 1 : 0);
				
				if (i >= N && j >= N)
					if (V[i][j] - V[i-N][j] - V[i][j-N] + V[i-N][j-N] != FR[L[t]])
						OK[i][j] = 0;
			}
	
	for (i = N; i <= M; i++)
		for (j = N; j <= M; j++)
			if (OK[i][j] == 1)
				sol++;
	
	fprintf(g, "%d", sol);
	
	fclose(f); fclose(g);
	
	return 0;
}