Cod sursă (job #546127)

Utilizator avatar S_Dan Sochirca Dan S_Dan IP ascuns
Problemă Fotografie (clasele 9-10) Compilator cpp | 1.23 kb
Rundă lasm_19_03_2020_cl_12_a Status evaluat
Dată 19 mar. 2020 15:36:53 Scor 0
#include <bits/stdc++.h>
using namespace std;

char a[1005][1005],b[1005][1005];
int nr[1005],m,n,p,q;
int xx,xy,xz,xm,val;


ofstream out("fotografie.out");


void check(int x, int y) {
  for (int i=x;i>x-p;--i) for (int j=y;j>y-q;--j) if(a[i][j]!=b[i-(x-p+1)][j-(y-q+1)]) return;
  out<<x-p+1<<' '<<y-q<<'\n';
}


int main(){
  ifstream cin("fotografie.in");

  cin>>n>>m;
  for(int i=0;i<n;i++) cin>>a[i];
  cin>>p>>q;
  for (int i=0;i<p;i++) cin>>b[i];

  for(int j=0;j<q;++j) for(int i=0;i<p;++i) xm=(xm*26+(b[i][j]-'a'))%46103;
  xx=1;
  xy=1;
  xz=1;
  for (int i=1;i<p;++i) xx=(xx*26)%46103;
  xz=(xx*26)%46103;

  for(int i=1;i<q;++i) xy=(xy*xz)%46103;

  for(int j=0;j<m;++j) for(int i=0;i<p-1;++i) nr[j]=(nr[j]*26+(a[i][j]-'a'))%46103;

  for(int i=p-1;i<n;++i){
    for(int j=0;j<m;++j) nr[j]=(nr[j]*26+(a[i][j]-'a'))%46103;

    val=0;
    for(int j=0;j<q-1;++j) val=(val*xz+nr[j])%46103;

    for(int j=q-1;j<m;++j){
      val=(val*xz+nr[j])%46103;
      if (val==xm) check(i,j);

      val=((val-xy*nr[j-q+1])%46103);
      if (val<0) val+=46103;
    }
    for(int j=0;j<m;++j){
      nr[j]=(nr[j]-xx*(a[i-p+1][j]-'a'))%46103;
      if(nr[j]<46103) nr[j]+=46103;
    }
  }
  return 0;
}