#include #include void main(){ char s1[100],s2[100],s3[100]; int l1,l2,l3; //lungherra delle stringhe int confronto1[101][101]; //creo le matrici di dimensione massima +1 per il bordo int confronto2[101][101]; int confronto3[101][101]; FILE *F1 = fopen("input.txt","r"); fscanf(F1,"%d %d %d",&l1,&l2,&l3); //leggo le lunghezze assert(l1<=100); assert(l2<=100); assert(l3<=100); int i; char c; //leggo le 3 stringhe for(i=0;i<=l1;i++){ //= perchè c'è anche \0 alla fine della stringa !! fscanf(F1,"%c",&s1[i]); } for(i=0;i<=l2;i++){ fscanf(F1,"%c",&s2[i]); } for(i=0;i<=l3;i++){ fscanf(F1,"%c",&s3[i]); } fclose(F1); //creo la matrice 1 di confronto int j; for(i=0;i<=l1;i++) {confronto1[l2][i]=0;} //azzero ultima riga for(i=0;i<=l2;i++) {confronto1[i][l1]=0;} //azzero ultima colonna for(i=l2;i>0;i--){ //partendo dalla fine faccio i confronti for(j=l1;j>0;j--){ if(s2[i]==s1[j]) { confronto1[i-1][j-1]=(confronto1[i][j])+1; //ho una corrispondenza tra caratteri } else { if (confronto1[i][j-1]>confronto1[i-1][j]) confronto1[i-1][j-1]=confronto1[i][j-1]; //scelgo il max else confronto1[i-1][j-1]=confronto1[i-1][j]; } } } int max1=confronto1[0][0]; //creo la matrice 2 di confronto for(i=0;i<=l1;i++) {confronto2[l3][i]=0;} //azzero ultima riga for(i=0;i<=l3;i++) {confronto2[i][l1]=0;} //azzero ultima colonna for(i=l3;i>0;i--){ //partendo dalla fine faccio i confronti for(j=l1;j>0;j--){ if(s3[i]==s1[j]) { confronto2[i-1][j-1]=(confronto2[i][j])+1; //ho una corrispondenza tra caratteri } else { if (confronto2[i][j-1]>confronto2[i-1][j]) confronto2[i-1][j-1]=confronto2[i][j-1]; //scelgo il max else confronto2[i-1][j-1]=confronto2[i-1][j]; } } } int max2=confronto2[0][0]; //creo la matrice 3 di confronto for(i=0;i<=l2;i++) {confronto3[l3][i]=0;} //azzero ultima riga for(i=0;i<=l3;i++) {confronto3[i][l2]=0;} //azzero ultima colonna for(i=l3;i>0;i--){ //partendo dalla fine faccio i confronti for(j=l2;j>0;j--){ if(s3[i]==s2[j]) { confronto3[i-1][j-1]=(confronto3[i][j])+1; //ho una corrispondenza tra caratteri } else { if (confronto3[i][j-1]>confronto3[i-1][j]) confronto3[i-1][j-1]=confronto3[i][j-1]; //scelgo il max else confronto3[i-1][j-1]=confronto3[i-1][j]; } } } int max3=confronto3[0][0]; //cerco il massimo int subsequence,cfr; if (max10)) { newj=j; newi=i; sub[subsequence-count]=s1[j]; count--; k++; } } } //ho trovato una sequenza comune a 1-2 la devo confrontare con 3 count=0; for(j=0;j<=l3;j++){ if(sub[count]==s3[j]) { count++; } } FILE *F2=fopen("output.txt","w"); fprintf(F2,"%d",count); fclose(F2); } if(cfr==2){ //la sottostringa minima è nel confronto 2 int k=0; for(i=newi+1;i<=l3;i++){ for(j=newj+1;j<=l1;j++){ if((s1[j]==s3[i])&&(confronto2[i-1][j-1]==subsequence-k)&&(count>0)) { newj=j; newi=i; sub[subsequence-count]=s1[j]; count--; k++; } } } //ho trovato una sequenza comune a 1-3 la devo confrontare con 2 count=0; for(j=0;j<=l2;j++){ if(sub[count]==s2[j]) { count++; } } FILE *F2=fopen("output.txt","w"); fprintf(F2,"%d",count); fclose(F2); } if(cfr==3){ //la sottostringa minima è nel confronto 3 int k=0; for(i=newi+1;i<=l3;i++){ for(j=newj+1;j<=l2;j++){ if((s2[j]==s3[i])&&(confronto3[i-1][j-1]==subsequence-k)&&(count>0)) { newj=j; newi=i; sub[subsequence-count]=s2[j]; count--; k++; } } } //ho trovato una sequenza comune a 2-3 la devo confrontare con 1 count=0; for(j=0;j<=l1;j++){ if(sub[count]==s1[j]) { count++; } } FILE *F2=fopen("output.txt","w"); fprintf(F2,"%d",count); fclose(F2); } } } //VR364760 Pagliarini Marco