Pagini recente »
Istoria paginii runda/cel_mai_greuuuuu/clasament
|
Istoria paginii runda/3/clasament
|
Monitorul de evaluare
|
Cod sursă (job #316989)
|
Cod sursă (job #546343)
Cod sursă (job
#546343)
#include <bits/stdc++.h>
using namespace std;
ifstream fi ("fotografie.in");
ofstream fo ("fotografie.out");
const int Q=1005;
char lin[Q][Q], f[Q];
int l,c,lf,cf;
short back[Q];
bool bun[Q][Q];
void lena (int x)
{
int g=0;
for(int i=x; i<=l-lf+x; i++)
{
for(int j=1; j<=c; j++)
{
if(f[1+g]==lin[i][j])
g++;
else
{
while(g)
{
g=back[g];
if(f[1+g]==lin[i][j])
{
g++;
break;
}
}
}
if(j>=cf)
{
if(g==cf)
g=back[g];
else
bun[i-x+1][j-cf+1]=0;
}
}
}
}
void balena()
{
int bk=0;
for(int act=2; act<=cf; act++)
{
if(f[bk+1]==f[act])
{
bk++;
}
else
while(bk!=0)
{
bk=back[bk];
if(f[bk+1]==f[act])
{
bk++;
break;
}
}
back[act]=bk;
}
}
int main()
{
fi>>l>>c;
for(int i=1; i<=l; i++)
fi>>lin[i]+1;
fi>>lf>>cf;
for(int i=1; i<=l-lf+1; i++)
{
for(int j=1; j<=c-cf+1; j++)
{
bun[i][j]=1;
}
}
for(int i=1; i<=lf; i++)
{
fi>>f+1;
balena();
lena(i);
}
for(int i=1; i<=l; i++)
for(int j=1; j<=c; j++)
{
if(bun[i][j]==1)
fo<<i-1<<" "<<j-1<<'\n';
}
return 0;
}