Cod sursa(job #74505)

Utilizator Binary_FireFlorin Pg Binary_Fire Data 25 iulie 2007 23:54:27
Problema PScPld Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <cstdio>
#define fin  "map.in"
#define fout "map.out"
#define Nmax 2048

#define FL
#define DBGx

int N,M,ret,pi[Nmax];
char map[Nmax][Nmax];

inline int cmp(int p1,int p2)	//egal - 0 ; altfel 1
{
	int i;

	for (i=1;i<=N;++i)
		if (map[p1][i]!=map[p2][i])
			return 1;
	return 0;	
}

void read()
{
	int i,pi,pj;
	char buff[4096];
	
	pi=1; pj=0;

	while (1)
	{
		fread(buff,1,4096,stdin);
		for (i=0;i<4096;++i)
			if ('a'<=buff[i] && buff[i]<='z')
			{
				++pj;
				if (pj>M)
				{
					++pi;
					pj=1;
				}
				map[pi][pj]=buff[i];
				if (pi==N && pj==M)
					return;				
			}
	}
}

int main() 
{
	int i,j,k,p;
	char aux;

	freopen(fin,"r",stdin); 
#ifdef FL
	freopen(fout,"w",stdout);
#endif 

	scanf("%d%d",&N,&M);
	fgetc(stdin);
	for (i=1;i<=N;i++) 
		fgets(map[i]+1,Nmax,stdin);

	//read();

	for (i=1;i<=N;++i)
	for (j=i;j<=M;++j)
	{
		aux=map[i][j];
		map[i][j]=map[j][i];
		map[j][i]=aux;
	}

#ifdef DBG
	for (i=1;i<=M;++i)
	{
		for (j=1;j<=N;++j)
			printf("%c",map[i][j]);
		printf("\n");
	}
#endif
	pi[1]=0;
	k=0;

	for (i=2;i<=M;++i)
	{
		while (k>0 && cmp(i,k+1)!=0)
			k=pi[k];
		if (cmp(i,k+1)==0)
			++k;
		pi[i]=k;
	}
	
	ret=M;
	p=pi[M];
	
	while (p>0)
	{
		if (p>M/2)
			ret=p;
		p=pi[p];
	}

	printf("%d\n",ret);
	
	return 0;
}