Pagini recente » Cod sursa (job #1669783) | Cod sursa (job #1466308) | Cod sursa (job #280617) | Cod sursa (job #896215) | Cod sursa (job #495717)
Cod sursa(job #495717)
#include<fstream>
using namespace std;
ifstream in("matrix.in");
ofstream out("matrix.out");
char a[1010][1010];
short int sol[1010][1010][27];
int m,n;
short int vir[27];
bool compare(short int A[] ,short int B []);
void add(short int A[], short int B[]);
void scad(short int A[], short int B[]);
void read()
{
in>>n>>m;
for( int i=1;i<=n;i++)
//in.getline(1+a[i],1005);
for( int j=1;j<=n;j++)
in>>a[i][j];
char z;
for(short int i=1;i<=m*m;i++)//construiesc vectorul virus
{
in>>z;
vir[z-'a']++;
}
}
void test()
{
for( int i=1;i<=n;i++)
{
for( int j=1;j<=n;j++)
out<<a[i][j]<<" ";
out<<endl;
}
}
void part1()//suma pe drept 1,1 i,j
{
for( int i=1;i<=n;i++)
for( int j=1;j<=n;j++)
{
add(sol[i][j] , sol[i-1][j]);
add(sol[i][j] , sol[i][j-1]);
scad(sol[i][j], sol[i-1][j-1]);//nu vreau sa imi dublez elemente
sol[i][j] [a[i][j]-'a']++;
}
}
int part2()
{
int suma=0;
short int temp[27];
for( int i=m;i<=n;i++)
for( int j=m;j<=n;j++)
{
for( int q=0;q<26;q++)
temp[q]=0;
add(temp , sol[i-m][j-m]);
add(temp , sol[i][j]);
scad(temp, sol[i][j-m]);
scad(temp, sol[i-m][j]);
//temp=sol[i][j] -sol[i][j-m] -sol[i-m][j] +sol[i-m][j-m] ;
if(compare(temp,vir))
suma++;
}
return suma;
}
bool compare(short int A[] ,short int B [])
{
for(short int i=0;i<26;i++)
if(A[i]!=B[i])
return false;
return true;
}
void add(short int A[], short int B[])// in A[] se scrie rezultatul adunarii
{
for(short int i=0;i<26;i++)
A[i]+=B[i];
}
void scad(short int A[], short int B[])//tot A[] se modifica
{
for(short int i=0;i<26;i++)
A[i]-=B[i];
}
int main()
{
read();
part1();
out<<part2();
return 0;
}