/*--------------------*/
/*correction tp coupes*/
/*--- LG nov 2004 --- */
/*--------------------*/

#include<stdio.h>

/*question 1*/
#define N 15
#define VRAI 1
#define FAUX 0


/*question 2*/
void visu(int t[N],int i, int j)
{
  int k;
  if (i<0 || i>N-1 || j<0 || j>N-1 || i>j)
    {
      printf("Erreur\n");
    }
  else
    {
      for (k=i;k<=j;k++)
	{
	  printf("%d ",t[k]);
	}
      printf("\n");
    } 
}

/*question 4*/
int nb_uns(int t[N])
{
  int i;
  int cpt = 0;
  for (i=0;i<N;i++)
    {
      if (t[i] == 1) {cpt++;}
    }
  return cpt;
}

/*question6a*/
int palin7_depuis(int t[N], int i)
{ 
  if ((t[i] == t[i+6]) && (t[i+1] == t[i+5])
      && (t[i+2] == t[i+4]) )
    {
      return VRAI;
    }
  else
    {
      return FAUX;
    }
}

/*question 6c et d*/
/*on essaie pour tous les i jusqu'à ce qu'on en trouve 1*/
int palin7(int t[N])
{
  int i;
  for (i=0;i<N-7;i++)
    {
      if (palin7_depuis(t,i)) 
	{
	  printf("indice : %d\n",i);
	  visu(t,i,i+6);
	  return VRAI;
	}
    }
  return FAUX;
}

/*question 7a*/
int est_palin(int t[N], int i, int l)
{
  int k = 0; 
  int fini=FAUX;
  while (!(fini) && (k<((l/2))))
    {
      if (t[i+k]!=t[i+l-k-1]) {fini = VRAI;}
      k = k+1;
    }
  return (!(fini));
}

/*question 7b*/
int palin_max(int t[N])
{
  int continuer = VRAI;
  int l=N;
  int i;

  /*On essaie les palins de taille l*/
  while(continuer && l>1)
    {
      for (i=0;i<N-l;i++)
	{
	  if (est_palin(t,i,l))
	    {
	      continuer = FAUX;
	    }
	}
      /*a ce stade on sait qu'il n'existe pas de palin de taille l*/
      /* on essaie avec l plus petit */
      l--;
    }
  return l;
}


/*question 7c*/
int palin_max2(int t[N])
{
  int continuer = VRAI;
  int l=N;
  int i;
  int cpt = 1; /*nimporte quoi différent de 0*/

  while(continuer && l>1)
    {
      cpt = 0; /*compteur du nb de palin de taille l*/
      for (i=0;i<N-l;i++)
	{
	  if (est_palin(t,i,l))
	    {
	      cpt = cpt+1;
	    }
	}
      /* on essaie avec l plus petit si 0 palin de taille l*/
      if (cpt != 0) {continuer = FAUX;}
      l--;
    }
  printf("On a %d palindromes de taille %d\n",cpt,l);
  return l;
}


/*question 8a*/
int coupe_nulle_maxi_depuis(int t[N], int i)
{
  int cpt = 0;
  while ((t[i] == 0) && (i<N))
    {
      cpt = cpt+1;
      i=i+1;
    }
  return cpt;
}


/*question 8b*/
int plus_longue_nulle(int t[N])
{
  int i;
  int taille; int max_tmp; int indice_tmp;
  max_tmp = 0;
  /*pour tout i, je recherche la coupe nulle maxi commencant par i*/
  /*je garde la taille du maximum jusqu'à présent, ainsi que son indice de début*/
  for (i=0;i<N;i++)
    {
      taille = coupe_nulle_maxi_depuis(t,i);
      if (taille > max_tmp)
	{
	  indice_tmp = i;
	  max_tmp = taille;
	}
    }
  /*pas demandé*/
  printf("Nulle maxi à l'indice %d, longueur = %d :\n",indice_tmp,max_tmp);
  visu(t,indice_tmp, indice_tmp + max_tmp -1);
  return (max_tmp);
}

/*question 9*/

int main(void)
{
  /*question 3*/
  int T[N];
  int i;
  int xi;

  int res;

  xi=13;
  T[0]=xi%2;
  for (i=1;i<N;i++)
    {
      xi = (xi*xi)%3953 ;
      T[i]= xi %2;
    }

  visu(T,0,N-1);

  /*question 4*/
  printf("nombre de 1 : %d \n",nb_uns(T));

  /*question 6e*/
  res = palin7(T);
  if (res) 
    {
      printf("Il existe un palindrome de taille 7\n");
    }
  else
    {
      printf("Il n'existe pas de palindrome de taille 7\n");
    }


  /*question 7e*/
  printf("taille du plus grand palindrome %d\n",palin_max(T));
  palin_max2(T);
  

  /*question8*/
  res = plus_longue_nulle(T);

  return 0;
}

