Pagini recente » Cod sursa (job #3141671) | Cod sursa (job #3132838) | Cod sursa (job #2562663) | Cod sursa (job #818700) | Cod sursa (job #31847)
Cod sursa(job #31847)
# include <stdio.h>
# include <string.h>
const int
MAXNRSEC=18,
MAXLEN=30010,
// MAXLEN=5010,
MAXINT=32000;
int n,a[MAXNRSEC+1][MAXNRSEC+1],crtsuf=0,crtsuf2=0,sol[MAXNRSEC+1];
char sequence[MAXNRSEC+1][MAXLEN+10];
char *sufarr[MAXLEN+1], *sufarr2[MAXLEN+1];
void populate (char stas);
int update_population();
int dist(char *s1, char *s2);
void copy_sufarr();
void citire();
void det_dist_all();
void back()
{
//all permutations of N elements such as that the
//total sum has the greatest magnitude
int v[MAXNRSEC+1]={0},k=1,sum=0,sel[MAXNRSEC+1]={0},i;
do
{
while (v[k]<=n-1)
{
if (v[k])
{
if (k>1) sum-=a[v[k-1]][v[k]];
sel[v[k]]--;
}
v[k]++;
sel[v[k]]++;
if (k>1) sum+=a[v[k-1]][v[k]];
if (sel[v[k]]==1)
{
if (k==n)
{
if (sum>sol[0])
{
sol[0]=sum;
for (i=1;i<=n;i++) sol[i]=v[i];
}
}
else
{
k++;
v[k]=0;
}
}
}
if (k>1) sum-=a[v[k-1]][v[k]];
sel[v[k]]--;
v[k]=0;
k--;
} while (k);
}
void scrie()
{
int i;
FILE *g=fopen("adn.out","w");
fprintf(g,"%s",sequence[sol[1]]);
for (i=2;i<=n;i++)
fprintf(g,"%s",sequence[sol[i]]+a[sol[i-1]][sol[i]]);
fprintf(g,"\n");
fcloseall();
}
int main()
{
citire();
det_dist_all();
back();
scrie();
return 0;
}
void citire()
{
FILE *f=fopen("adn.in","r");
fscanf(f,"%d",&n);
fgets(sequence[0],100,f);
sequence[0][0]='\0';
int i,aux,ok,j;
for (i=1;i<=n;i++)
{
fgets(sequence[i],MAXINT,f);
aux=strlen(sequence[i]);
sequence[i][aux-1]=sequence[i][aux];
}
//checking for duplicates
i=1;
while (i<=n)
{
ok=0;
for (j=1;j<=n;j++)
if (j!=i)
if (strstr(sequence[j],sequence[i])!=NULL)
{
strcpy(sequence[i],sequence[n]);
sequence[n][0]='\0';
n--;
ok=1;
break;
}
if (!ok) i++;
}
fclose(f);
}
void det_dist_all()
{
int i,j;
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
if (i!=j)
a[i][j]=dist(sequence[i],sequence[j]);
}
void copy_sufarr()
{
crtsuf=crtsuf2;
int i;
for (i=1;i<=crtsuf;i++) sufarr[i]=sufarr2[i];
}
int dist(char *s1, char *s2)
{
char *q=s2;
int i,sol=0,aux;
crtsuf=strlen(s1);
for (i=0;i<=crtsuf-1;i++) sufarr[i+1]=s1+i;
while (*q)
{
populate(*q); //populate sufarr2[] based on a character from q;
aux=update_population(); //update the population in sufarr2[] and check for mins/maxs
if (aux==1) sol=q-s2+1;
copy_sufarr(); //copy the population from sufarr2 to sufarr;
q++;
}
return sol;
}
void populate (char stas)
{
crtsuf2=0;
int i;
for (i=1;i<=crtsuf;i++)
if (*(sufarr[i])==stas)
sufarr2[++crtsuf2]=sufarr[i];
}
int update_population()
{
int i=1,ok=0;
while(i<=crtsuf2)
{
sufarr2[i]++;
if (*(sufarr2[i])=='\0')
{
ok=1;
sufarr2[i]=sufarr2[crtsuf2];
crtsuf2--;
}
else
i++;
}
return ok;
}