Cod sursa(job #159492)

Utilizator rethosPaicu Alexandru rethos Data 14 martie 2008 10:31:34
Problema Perle Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <fstream.h>
#define NM 100001
#define XM 1000000
int l[NM];
long dim,n=1;
char x[XM];
void strcpy(long k,int nr)
{long i;
 for (i=n;i>=k;i--) x[i+nr]=x[i];
 n+=nr;
}

int perle()
{ long k=0;
  if (dim==1) return 1;
  if (dim==2) return 0;
  if (dim==3&&l[1]==1&&l[2]==2) return 1;
  x[0]='0';
  if (l[1]==3) x[1]='C';
	else x[1]='B';
  while (k<n&&k<dim)
	{ k++;
	  if (x[k]=='B')
		{ switch(l[k])
		       {case 1: strcpy(k,4);
				x[k]='1';
				x[k+1]='A';
				x[k+2]='3';
				x[k+3]='A';
				x[k+4]='C';
				break;
			case 2: strcpy(k+2,1);
				x[k]='2';
				x[k+1]='B';
				n=n+1;
				break;
			case 3: return 0;}
		}
	  if (x[k]=='C')
		{ switch(l[k])
		       {case 1: strcpy(k+3,2);
				x[k]='1';
				x[k+1]='2';
				x[k+2]='A';
				n=n+2;
				break;
			case 2: x[k]='2';
				break;
			case 3: strcpy(k+3,2);
				x[k]='3';
				x[k+1]='B';
				x[k+2]='C';
				n=n+2;
				break;}
		}
	  if (x[k]=='1'&&l[k]!=1) return 0;
	  if (x[k]=='2'&&l[k]!=2) return 0;
	  if (x[k]=='3'&&l[k]!=3) return 0;
	}
  if (n!=dim) return 0;
  return 1;
}
int main()
{ int n,i,j;
  ifstream f("perle.in");
  ofstream g("perle.out");
  f>>n;
  for (i=1;i<=n;i++)
	{ f>>dim;
	  for (j=1;j<=dim;j++) f>>l[j];
	  g<<perle()<<'\n';
	}
  f.close();
  g.close();
  return 0;
}