Cod sursa(job #432703)

Utilizator hadesgamesTache Alexandru hadesgames Data 2 aprilie 2010 17:12:14
Problema Zoo Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.43 kb
#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;
}