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); }
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; }
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); }
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); }
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); }
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); }
// 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; }
// 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; }