Pagini recente »
Monitorul de evaluare
|
Istoria paginii utilizator/stoianrares
|
Istoria paginii runda/very_hard_contest
|
Istoria paginii utilizator/mateimmp1234
|
Cod sursă (job #91390)
Cod sursă (job
#91390)
#include <fstream>
#include<cstring>
#include<iostream>
using namespace std;
ifstream in("fotografie.in");
ofstream out("fotografie.out");
char txt[1001][1001],pat[1001][1001];
int r = 101, n, m, p, q;
#define d 256
bool verifica( int lp, int lt, int i )
{
for ( int j = 0; j < q; j++ )
if ( txt[lt][ i + j ] != pat[lp][j] )
return false;
return true;
}
void cautare( int k )
{
int i, j;
int p1 = 0;
int t = 0;
int h = 1;
for ( i = 0; i < q - 1; i++ )
h = ( h * d ) % r;
for ( i = 0; i < q; i++ )
{
p1 = ( d * p1 + pat[0][i] ) % r;
t = ( d * t + txt[k][i] ) % r;
}
for ( i = 0; i <= m - q; i++ )
{
if ( p1 == t )
{
int lp = 0, lt = k;
while( verifica( lp, lt , i) == true && lp < p && lt < n )
{
lp++;
lt++;
}
if ( lt - 1 == k + p - 1 )
out << k <<' '<< i <<'\n';
}
if ( i < m - q )
{
t = ( d * ( t - txt[k][i] * h ) + txt[k][ i + q ] ) % r;
if ( t < 0 )
t = t + r;
}
}
}
int main()
{
int i, j;
in >> n >> m;
for ( i = 0; i < n; i++ )
for ( j = 0; j < m; j++ )
in >> txt[i][j];
in >> p >> q;
for ( i = 0; i < p; i++ )
for ( j = 0; j < q; j++ )
in >> pat[i][j];
for ( i = 0; i < n; i++ )
cautare(i);
return 0;
}