Pagini recente » Cod sursa (job #1856529) | Cod sursa (job #343537) | Cod sursa (job #2103962) | Cod sursa (job #1951202) | Cod sursa (job #432703)
Cod sursa(job #432703)
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <utility>
#include <vector>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
FILE *in,*out;
int n,m;
long long key[3],bazam[3];
const int baza=30000;
const int modul[]={200029,200033,200041};
int a[305][305];
int b[305][305][3],minap;
int ver(int lung)
{
int i,j,k,nr;
if (lung>n||lung >m)
return 1;
vector<pair<int,int> > hash[modul[0]];
bazam[0]=bazam[1]=bazam[2]=baza;
for (i=2;i<=lung;i++)
for (k=0;k<3;k++)
bazam[k]=(bazam[k]*baza)%modul[k];
//hash pe linii
for (i=1;i<=n;i++)
{
memset(key,0,sizeof(key));
for (j=1;j<=lung;j++)
for (k=0;k<3;k++)
{
key[k]*=baza;
key[k]+=a[i][j];
key[k]%=modul[k];
}
b[i][lung][0]=key[0];
b[i][lung][1]=key[1];
b[i][lung][2]=key[2];
for (j=lung+1;j<=m;j++)
for (k=0;k<3;k++)
{
key[k]*=baza;
key[k]+=a[i][j];
key[k]%=modul[k];
key[k]-=(bazam[k]*a[i][j-lung])%modul[k];
if (key[k]<0)
key[k]+=modul[k];
b[i][j][k]=key[k];
}
}
//hash pe matrici;
for (j=lung;j<=m;j++)
{
memset(key,0,sizeof(key));
for (i=1;i<=lung;i++)
for (k=0;k<3;k++)
{
key[k]*=baza;
key[k]+=b[i][j][k];
key[k]%=modul[k];
}
hash[key[0]].pb(mp(key[1],key[2]));
for (i=lung+1;i<=n;i++)
{
for (k=0;k<3;k++)
{
key[k]*=baza;
key[k]+=b[i][j][k];
key[k]%=modul[k];
key[k]-=(bazam[k]*b[i-lung][j][k])%modul[k];
if (key[k]<0)
key[k]+=modul[k];
}
hash[key[0]].pb(mp(key[1],key[2]));
}
}
// hashing done phew
//printf("pentru lungime %d %d\n",lung,minap);
for (i=0;i<modul[0];i++)
if (!hash[i].empty())
{
sort(hash[i].begin(),hash[i].end());
// printf("cu key-ul %d: (%d %d)",i,hash[i][0].fi,hash[i][0].se);
nr=1;
for (j=1;j<hash[i].size();j++)
{
// printf(" (%d %d)",hash[i][j].fi,hash[i][j].se);
if (hash[i][j]!=hash[i][j-1])
{
if (nr>=minap)
return 0;
nr=0;
}
nr++;
}
// printf("\n");
if (nr>=minap)
return 0;
}
//printf("returneaza 1\n");
return 1;
}
int main()
{
int t,i,rez,j;
in=fopen("poze.in","r");
out=fopen("poze.out","w");
fscanf(in,"%d",&t);
for (;t;t--)
{
fscanf(in,"%d%d%d",&n,&m,&minap);
for (i=1;i<=n;i++)
for(j=1;j<=m;j++)
fscanf(in,"%d",&a[i][j]);
rez=0;
for (i=1<<30;i;i>>=1)
{
rez+=i;
if (ver(rez))
rez-=i;
}
fprintf(out,"%d\n",rez);
}
fclose(in);
fclose(out);
return 0;
}