Cod sursa(job #652659)

Utilizator yonnssyonns yonns yonnss Data 25 decembrie 2011 18:39:40
Problema ADN Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.25 kb
#include <stdio.h>
#include <string.h>
struct Secv
{
    char sir[30001];

} secvente[20];
int n;
int m[20][20];
int min=2000000000;
char mins[540000];
int comun(int primu, int aldoilea){
    int j,i;
    int k;
    int lp,ld;
    int comune=0;
    int max=0;
    lp=strlen(secvente[primu].sir);
    ld=strlen(secvente[aldoilea].sir);

    for(i=0;i<lp;i++) {
        comune=0;
        j=0;
        k=i;
        while(j<ld && k<lp){
            if(secvente[primu].sir[k]==secvente[aldoilea].sir[j]) {
            comune++;

            }
            else break;
            k++;
            j++;


        }
        if(comune>max && (k==lp ||j==ld)) max=comune;


    }
    return max;
}

void determinacomune(){
    int i,j;
    for(i=0;i<n;i++) for(j=0;j<n;j++) if(i!=j){
    m[i][j]=comun(i,j);


    }



}

void citeste()
{
    FILE *f=fopen("adn.in","r");
    fscanf(f,"%d",&n);
    int i;
    for(i=0; i<n; i++) fscanf(f,"%s",secvente[i].sir);
    fclose(f);
}

void sterge(){
int x,y;
int l;

}
int verificaunicitate(int vect[20],int i){
if(vect[i]!=-1) return 0;
return 1;

}
void determina(char s[540000],int linie, int start,int l,int indice,int vect[20],int ordine){
    int ltemp;
 //   for(int j=0;j<n;j++) printf("%d ",vect[j]);
  if(ordine==n) printf("%s  %d\n",s,l);

  //  else printf("\n");
    if(l>min) return ;
    if(ordine==n)
    if(l<min) {   strcpy(mins,s); min=l; }


    int i;

    for(i=0;i<n;i++) if(i!=linie ) {
       if(verificaunicitate(vect,i)) {
       vect[i]=ordine;
       strcat(s,secvente[i].sir+m[linie][i]);
       ltemp=strlen(s);
       determina(s,i,start,ltemp,ltemp,vect,ordine+1);
       vect[i]=-1;
       s[indice]='\0';
       }

    }


}
int main()
{
    citeste();
     //   for(int i=0;i<n;i++) printf("%s\n",secvente[i].sir);

    determinacomune();
    sterge();
    int v[20];
    for(int i=0;i<20;i++) v[i]=-1;
    char sir[540000]="";
    //strcpy(sir,secvente[0].sir);
    determina(sir,0,0,0,0,v,0);
    int x,y;

  //  for(y=0;y<n;y++) {
  //  for(x=0;x<n;x++) printf("%d ",m[y][x]);
  //  printf("\n");

 //   }
 FILE *out=fopen("adn.out","w");

    fprintf(out,"%s\n",mins);
    fclose(out);
    return 0;
}