Exemplo n.º 1
0
	void link(const value_type& x, const value_type& y) {
		if (x == y) return;
		rank_type rx = getrank(x), ry = getrank(y);
		if (rx < ry)
			setparent(x, y);
		else
			setparent(y, x);

		if (rx == ry)
			setrank(x, getrank(x) + 1);
	}
Exemplo n.º 2
0
int main() {
    char in[10];
    while(1) {
        int r, s, i;
        int p[13][4], pt[13] = {};
        for(i = 51; i >= 0; i--) {
            scanf("%s", in);
            if(in[0] == '#')    return 0;
            r = getrank(in[0]);
            s = getsuit(in[1]);
            p[i%13][pt[i%13]++] = s*13+r;
           // printf("%d %d %d\n", r, s, s*13+r);
        }
        for(i = 0; i < 13; i++) {
            r = p[i][0], p[i][0] = p[i][3], p[i][3] = r;
            r = p[i][1], p[i][1] = p[i][2], p[i][2] = r;
        }
        int idx = 12, cnt = 0, last;
        while(pt[idx] > 0) {
            int tmp = (p[idx][pt[idx]-1]-1)%13;
            last = p[idx][pt[idx]-1];
            pt[idx]--;
            idx = tmp;
            cnt++;
        }
        printf("%02d,%c%c\n", cnt, putrank((last-1)%13+1), putsuit((last-1)/13));

    }
    return 0;
}
Exemplo n.º 3
0
int
prevcl(u_char *kouho, int mode)
{
	CLREC	*clptr;

	initkbuf(kouho);

	if (!khcount) return 0;

	if (!mode && (selectid > 1))
		selectid--;

	else if ((mode < 2) && (clptr = prevrecblk())) {
		clt1st = clptr;
		mkkouho();
		getrank();
		selectid = khcount;
	}
	else {
		cvtclknj();
		return 0;
	}

	cvtclknj();

	return hzstrlen(inputyomi, (int)clt1st -> cllen);
}
Exemplo n.º 4
0
int
nextcl(u_char *kouho, int mode)
{
	CLREC	*clptr;

	initkbuf(kouho);

	if (!khcount) return 0;

	if (!mode && (selectid < khcount))
		selectid++;

	else if((mode < 2) && (clptr = nextrecblk())) {
		selectid = 1;
		clt1st = clptr;
		mkkouho();
		getrank();
	}
	else {
		cvtclknj();
		return 0;
	}

	cvtclknj();

	return hzstrlen(inputyomi, (int)clt1st -> cllen);
}
Exemplo n.º 5
0
int
cl2knj(u_char *yomi, int len, u_char *kouho)
{
	u_char	*ptr1;
	u_char	*ptr2;
	int	i;

	khcount = nkhcount = 0;

	initkbuf(kouho);

	if (len > MAXCLINPUTLEN * 2) len = MAXCLINPUTLEN * 2;

	ptr1 = yomi; ptr2 = hyomi;
	for (i = 0 ; i < len ; i++) {
		if (isknj1(*ptr1)) {
			if (++i >= len) break;
		}
		ptr1 += sj2cd_chr(ptr1, ptr2++);
	}
	*ptr2 = 0;

	strlcpy(orgyomi, yomi, (int)(ptr1 - yomi) + 1);

	if (!hyomi[0]) return 0;

	freework();

	inputyomi = orgyomi;
	cnvstart = ystart = hyomi;
	cnvlen = sstrlen(hyomi);

	mkjiritu(0);

	mkbunsetu();

	if (!maxclptr) wakachi();

	jrt1st = maxjptr;
	clt1st = maxclptr;

	mkkouho();

	getrank();

	selectid = 1;

	cvtclknj();

	return hzstrlen(inputyomi, (int)clt1st -> cllen);
}
Exemplo n.º 6
0
Arquivo: main.cpp Projeto: jpbirdy/poj
void work()
{
    if (k == 1) return (void) printf("%lld\n", mini);
    if (k == n * (n + 1) / 2) return (void) printf("%lld\n", maxi);
    for (long long l = mini, r = maxi; l < r; )
    {
        long long mid = (l + r) >> 1, rank = 0;
        vetot = 0, root = 0;
        for (long long i = n; i >= 1; -- i)
        {
            insert(root, s[i]);
            rank += getrank(mid + s[i - 1]);
        }
        rank < k ? (l = mid + 1) : (r = mid);
        ans = l - 1;
    }
    printf("%lld\n", ans);
}
Exemplo n.º 7
0
// remember only use sexp to return value
SEXP wmw_paired_replicates(SEXP _X, SEXP _Y, SEXP _lenY, SEXP _corr, SEXP _method, SEXP _mc_rep){
    
    int m=length(_X);
    double *X0=REAL(_X), *Y0=REAL(_Y);
    int *lenY=INTEGER(_lenY);  
    double Umw;
    int i,b;
//    int corr=asInteger(_corr);// 0,1,-1,2. correction
//    int method=asInteger(_method);// 0,1,2,3,4

	int n=0;
    for (i = 0; i < m; i++) n+=lenY[i];
            
    double *X = malloc(m*sizeof(double));
    double *Y = malloc(n*sizeof(double));
    double *xy = malloc((m+n)*sizeof(double));
    double *r = malloc((m+n)*sizeof(double));
    
    int mc_rep=asInteger(_mc_rep); // 0: exact perm, 1: z only, 1e4: mc
    SEXP _ans=PROTECT(allocVector(REALSXP, mc_rep));
    double *ans=REAL(_ans);    

    // Monte Carlo
    for (b=0; b<mc_rep; b++) {                
        ans[b]=compute_wmw_paired_replicates_stat(X0, Y0, X, Y, lenY, m);
        //for (i=0; i<n; i++) PRINTF("%f ", Y[i]); PRINTF("\n");
        //for (i=0; i<m; i++) PRINTF("%f ", X[i]); PRINTF("\n");
        for (i=0; i<m; i++) xy[i]=X[i];
        for (i=0; i<n; i++) xy[i+m]=Y[i];
        getrank (m+n, xy, r);
        for (i = 0; i < m+n; i++) r[i]+=1; // 0 based in C, 1 based in R
        Umw=0;
        for (i = 0; i < m; i++) Umw+=r[i];
        Umw=Umw - m*(m+1)/2.0;
        ans[b]=Umw;
    }   
    //for (b=0; b<mc_rep; b++) PRINTF("%f ", ans[b]); PRINTF("\n");
            
    free(X); free(Y); free(xy); free(r);

    UNPROTECT(1);
    return _ans;
}
Exemplo n.º 8
0
// xy is passed in so that there is no need to allocate memory for getting rank
// m=n
double compute_pair_wmw_Z(double * X, double * Y, double * xy, int m, int n, int corr, int method, double adj, int return_var) {

    int i,j,k;
    int N=m+n;
    double U, a, b, c, mean_x, mean_y, z;
    double tmp_1=0, tmp_2=0, tmp_3=0, tmp_4=0, tmp_5=0, tmp_6=0, theta=0, tao=0; 
    double A, B, C_1, v_f, A_0, B_0, C_1_0, v_f_0;
    double C_2_cov, C_2_cov_0, C_2_cov_1, C_2_var, C_2_var_0;
    double var_exact, var_exact_0, var_exact_1, var_exact_2, var_exact_3, var_large, var_large_0, var;
    
    double *r=malloc(N*sizeof(double));
    double *Fy_X = malloc(m*sizeof(double));
    double *Fx_Y = malloc(n*sizeof(double));
    
    for (i = 0; i < m; i++) xy[i]=X[i];
    for (j = 0; j < n; j++) xy[m+j]=Y[j];    

    getrank (N, xy, r);
    for (i = 0; i < N; i++) r[i]+=1; // 0 based in C, 1 based in R
    
    U=0;
    for (j = 0; j < n; j++) U+=r[m+j];    
    U=(U - n*(n+1.0)/2)/m/n;
    double corr1;
    if(corr!=0) {
        if(corr==2) {
            if(U==0.5) corr1=0; else corr1=U>0.5?1:-1;        
        } else corr1=corr;
        U=U-corr1*0.5/m/n;
    }
    //PRINTF("%f ", U); PRINTF("\n");
    
    for (i = 0; i < m; i++) {
        Fy_X[i]=0;
        for (j = 0; j < n; j++) Fy_X[i]+= Y[j]<X[i]?1:(Y[j]==X[i]?0.5:0);
        Fy_X[i]/=n;
    }
    for (j = 0; j < n; j++) {
        Fx_Y[j]=0;
        for (i = 0; i < m; i++) Fx_Y[j]+= X[i]<Y[j]?1:(X[i]==Y[j]?0.5:0);
        Fx_Y[j]/=m;
    }
    
    a=0; for (i = 0; i < m; i++) a+=pow(Fy_X[i],2); a/=m;
    mean_x=0; for (i = 0; i < m; i++) mean_x+=Fy_X[i]; mean_x/=m;
    a=(a-pow(mean_x,2))*m/(m-1); // *m/(m-1) is finite sample adj.

    b=0; for (j = 0; j < n; j++) b+=pow(Fx_Y[j],2); b/=n;
    mean_y=1-mean_x; 
    b=(b-pow(mean_y,2))*n/(n-1);
    
    // - 2*cov(Fy(X), Fx(Y))
    c=0; for (i = 0; i < m; i++) c+=Fy_X[i] * Fx_Y[i]; c/=m;
    c=(c - mean_x * mean_y)*m/(m-1);
    var_large  =    a + b     - 2*c;
    var_large_0=1./12 + 1./12 - 2*c;
    
    //tmp.1=mean(outer(1:m,1:n, function(i,j) ifelse(i!=j,Y[i]>X[i] & Y[j]>X[i],NA)), na.rm=TRUE) 
    //tmp.2=mean(outer(1:m,1:n, function(i,j) ifelse(i!=j,Y[i]>X[i] & Y[i]>X[j],NA)), na.rm=TRUE)
    //tmp.3=mean(outer(1:m,1:n, function(i,j) ifelse(i!=j,Y[j]>X[i] & Y[i]>X[j],NA)), na.rm=TRUE)
    //theta=mean(outer(1:m,1:n, function(i,j) ifelse(i!=j,Y[j]>X[i],NA)), na.rm=TRUE) # note that theta!=FxY here b/c i==j not counted
    for(i = 0;i < m;i++){
    for(j = 0;j < m;j++){
          if(i==j) continue;
          tmp_1+=(Y[i]>X[i])*(Y[j]>X[i]);
          tmp_2+=(Y[i]>X[i])*(Y[i]>X[j]);
          tmp_3+=(Y[j]>X[i])*(Y[i]>X[j]);
          theta+=(Y[j]>X[i]);
    }}    
    tmp_1/=m*(m-1);
    tmp_2/=m*(m-1);
    tmp_3/=m*(m-1);
    theta/=m*(m-1);
    
    //tmp.4=outer.3.mean(1:m,1:m,1:m, function(i,j,k) ifelse(i==j|i==k|j==k,NA,(Y[j]>X[i])*(Y[i]>X[k])) )    
    //tmp.5=outer.3.mean(1:m,1:m,1:m, function(i,j,k) ifelse(i==j|i==k|j==k,NA,(Y[j]>X[i])*(Y[k]>X[i])) )
    //tmp.6=outer.3.mean(1:m,1:m,1:m, function(i,j,k) ifelse(i==j|i==k|j==k,NA,(Y[j]>X[i])*(Y[j]>X[k])) )
    for(i = 0;i < m;i++){
    for(j = 0;j < m;j++){
          if(i==j) continue;
          for(k = 0;k < m;k++){
              if (k==i || k==j) continue;
              tmp_4 +=(Y[j]>X[i])*(Y[i]>X[k]);
              tmp_5 +=(Y[j]>X[i])*(Y[k]>X[i]);
              tmp_6 +=(Y[j]>X[i])*(Y[j]>X[k]);
          }
    }}    
    tmp_4/=m*(m-1)*(m-2);
    tmp_5/=m*(m-1)*(m-2);
    tmp_6/=m*(m-1)*(m-2);
    
    //C.2.cov=    m*(m-1)*(m-2)* (tmp.4 - theta.sq) * 2 
    //C.2.var=    m*(m-1)*(m-2)* (tmp.5 - theta.sq + tmp.6 - theta.sq) *finite.adj 
    C_2_cov_0=m*(m-1)*(m-2)* (tmp_4 - 1.0/4) * 2 ;
    C_2_cov  =m*(m-1)*(m-2)* (tmp_4 - theta*theta) * 2 ;
    C_2_var=  m*(m-1)*(m-2)* (tmp_5 - theta*theta + tmp_6 - theta*theta);
    C_2_var_0=m*(m-1)*(m-2)* (1./12 + 1./12);
    //PRINTF("%f %f %f \n", tmp_4, theta, C_2_cov);
        
    //tao=mean(Y>X)
    for(i = 0;i < m;i++) tao+=Y[i]>X[i]; tao/=m;
    A  =m*        tao*(1-tao);
    B  =m*(m-1)*  (tmp_1 - tao*theta + tmp_2 - tao*theta) ;
    C_1=m*(m-1)*  (theta*(1-theta)  + (tmp_3 - theta*theta));
    v_f=A + 2*B + C_1;

    //var.exact.0=(C.2.var.0 + C.2.cov + v.f(theta,tao))/m^3 
    //var.exact  =(C.2.var   + C.2.cov + v.f(theta,tao))/m^3 
    var_exact  =(C_2_var   + C_2_cov + v_f)/pow(m,3);    
    var_exact_0=(C_2_var_0 + C_2_cov_0+v_f)/pow(m,3);
    var_exact_1=(C_2_var_0 + C_2_cov + v_f)/pow(m,3);
    C_2_cov_1=m*(m-1)*(m-2)* (tmp_4 - (theta*theta-var_exact_1/m)) * 2; // a less biased estimate of theta^2, a one-step correction
    var_exact_2=(C_2_var_0 + C_2_cov_1+v_f)/pow(m,3);

    A_0  =m*        1./2*(1-1./2);
    B_0  =m*(m-1)*  (tmp_1 - tao*theta + tmp_2 - tao*theta) ;
    C_1_0=m*(m-1)*  (1./2*(1-1./2)  + (tmp_3 - (theta*theta-var_exact_1/m)));
    v_f_0=A_0 + 2*B_0 + C_1_0;    
    var_exact_3=(C_2_var_0 + C_2_cov_1+v_f_0)/pow(m,3);
    //PRINTF("%f %f %f %f \n", C_2_var_0, C_2_cov, v_f, C_2_var);

    //PRINTF("%f %f %f %f %f \n", U, var_large_0, var_large, var_exact_0, var_exact);
    switch(method){
        case -1: var=var_large_0; break;
        case -2: var=var_large; break;
        case -3: var=var_exact; break;
        case 0: var=var_exact_0; break;
        case 1: var=var_exact_1; break;
        case 2: var=var_exact_2; break;
        case 3: var=var_exact_3; break;
        default: var=0;
    }
    //if(method==0) var=var_large_0; else if (method==1) var=var_large; else if (method==2) var=var_exact_0; else if (method==3) var=var_exact; else if (method==4) var=var_exact_2; else if (method==5) var=var_exact_3; else var=0;//last one cannot happen
    if(return_var) z=var; else z=sqrt(m*1.)*(U-0.5)/sqrt(var); 
    //PRINTF("%f %f %f %f %f %f\n", a1, b1, a1/m/m + b1/n/n, - (m-(2*m+1)*mean_x+(N+1)*mean_x*mean_x)/m/n, mean_x, z);
  

    free(Fy_X);
    free(Fx_Y);
    free(r);
    
    return z;
}