Cod sursă (job #91390)

Utilizator avatar cristinamatei Matei Cristina Gabriela cristinamatei IP ascuns
Problemă Fotografie (clasele 9-10) Compilator cpp | 1,52 kb
Rundă Tema 7 clasele 9-10 2014/15 Status evaluat
Dată 23 nov. 2014 21:06:58 Scor 40
#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;
}