Pagini recente » Cod sursa (job #315765) | Cod sursa (job #214857) | Cod sursa (job #3131495) | Cod sursa (job #39050) | Cod sursa (job #2547733)
#include <iostream>
#include <fstream>
std::ifstream f("matrix.in");
std::ofstream g("matrix.out");
const int NMAX = 1005;
const int LITERE = 30;
char genom[NMAX][NMAX],virus[NMAX][NMAX];
int n,m,s[NMAX][NMAX][LITERE],fr[LITERE],sol;
int suma(int is,int js,int ij,int jj,int litera){
return s[ij][jj][litera] - s[is - 1][jj][litera] - s[ij][js - 1][litera] + s[is - 1][js - 1][litera];
}
int main(){
f >> n >> m;
for(int i = 1;i <= n;++i)
for(int j = 1;j <= n;++j)
f >> genom[i][j];
for(int i = 1;i <= m;++i){
for(int j = 1;j <= m;++j){
f >> virus[i][j];
fr[virus[i][j] - 'a']++;
}
}
//fac sume partiale pentru fiecare litera de la 'a' la 'z'
for(char litera = 'a';litera <= 'z';++litera){
int l = (litera - 'a');
for(int i = 1;i <= n;++i)
for(int j = 1;j <= n;++j)
s[i][j][l] = s[i - 1][j][l] + s[i][j - 1][l] -
s[i - 1][j - 1][l] + (genom[i][j] == litera);
}
for(int i = 1;i <= n - m + 1;++i){
for(int j = 1;j <= n - m + 1;++j){
int is = i,js = j,ij = i + m - 1,jj = j + m - 1;
bool ok = true;
for(char litera = 'a';litera <= 'z' && ok;++litera)
if(suma(is,js,ij,jj,litera - 'a') != fr[litera - 'a'])
ok = false;
sol += ok;
}
}
g << sol;
return 0;
}