#include "my.h" #include #define LEN 20 main() { int s1, nsites, *pos , i , j, k, *nall, count, nsam ; int a, b, count1, count2, countq ; int s2 , n00, n01, n10, n11 ; char ***gam ; double dmin, dmax, dprime, d, rsq; double p0, q0, n ; scanf( " %d", &nsam); scanf(" %d", &nsites ); printf(" nsam: %d nsites: %d\n", nsam, nsites); pos = (int *)malloc( (nsites+1)*sizeof( int ) ) ; nall = (int *)malloc( (nsites+1)*sizeof( int ) ) ; gam = (char ***)malloc( 2*nsam*sizeof( char **) ) ; for(i=0; i< 2*nsam; i++) { gam[i] = (char **)malloc( (nsites+1)*sizeof( char *) ) ; for( j=0; j<=nsites; j++) gam[i][j] = (char *) malloc( LEN*sizeof(char) ) ; } for( i=1; i<= nsites; i++) scanf(" %d",pos+i ); for( i=1; i<= nsites; i++) printf(" %d", pos[i] ) ; printf("\n"); for( j=0; j< 2*nsam; j++) for( i=0; i <= nsites; i++) scanf(" %s",gam[j][i] ) ; for( s1 = 1; s1 <= nsites; s1++) { i=0; while( (i < 2*nsam) && ( gam[i][s1][0] == '?') ) { i++; } if( i == 2*nsam ) nall[s1] = 0 ; else{ for( j= i+1; j< 2*nsam; j++) if( strcmp( gam[i][s1], gam[j][s1] ) == 0 ) { gam[j][s1][0] = 1 ; } gam[i][s1][0] = 1 ; j = i+1 ; while( ( j < 2*nsam) && (( gam[j][s1][0] == '?' ) || (gam[j][s1][0] == 1 ) ) ) { j++ ; } if( j == 2*nsam ) nall[s1] = 1 ; else { for( k=j+1; k< 2*nsam; k++){ if( strcmp( gam[j][s1], gam[k][s1]) == 0 ){ gam[k][s1][0] = 2 ; } } gam[j][s1][0] = 2 ; count1 = count2 = countq = 0 ; for( i=0; i< 2*nsam; i++){ a = gam[i][s1][0] ; if( a == 1 ) count1++; else if( a == 2 ) count2++; else if( a == '?' ) countq++; } if( count1+count2 + countq == 2*nsam ) nall[s1] =2 ; else nall[s1] = 3 ; } } printf(" %d ",nall[s1]); } /* for( i=0; i< 2*nsam; i++) { printf("\n"); for( j=1; j<=nsites; j++) printf(" %d",gam[i][j][0] ); } */ printf("\n"); for( s1=1; s1 < nsites; s1++){ if( nall[s1] == 2 ) for( s2 = s1+1; s2 <= nsites; s2++){ if( nall[s2] == 2 ) { n00 = n01 = n10 = n11 = 0 ; for( i=0; i<2*nsam; i++){ if( (gam[i][s1][0] == 1 )&&( gam[i][s2][0] == 1 ) ) n00++ ; if( (gam[i][s1][0] == 1 )&&( gam[i][s2][0] == 2 ) ) n01++ ; if( (gam[i][s1][0] == 2 )&&( gam[i][s2][0] == 1 ) ) n10++ ; if( (gam[i][s1][0] == 2 )&&( gam[i][s2][0] == 2 ) ) n11++ ; } printf("%d %d %d %d %d %d %d ",pos[s1],pos[s2],pos[s2]-pos[s1], n00, n01, n10, n11 ) ; n = n00 + n01 + n10 + n11 ; p0 = (n00+n01)/n ; q0 = (n00 + n10)/n ; d = (n00/n) - p0*q0 ; dmin = MAX( -p0*q0, -(1.0-p0)*(1.0-q0) ) ; dmax = MIN( (1.0-p0)*q0, p0*(1.0-q0) ) ; dprime = (d < 0) ? -d/dmin : d/dmax ; rsq = (d*d)/(p0*(1.0-p0)*q0*(1.0-q0)) ; printf(" %lf %lf %lf %lf %lf\n",p0,q0,d, dprime, rsq ); } }} }