codepad
[
create a new paste
]
login
|
about
Language:
C
C++
D
Haskell
Lua
OCaml
PHP
Perl
Plain Text
Python
Ruby
Scheme
Tcl
#include "decoder.h" #include "decoderlib.h" #include <stdio.h> #include <string.h> #include <stdlib.h> #define MAXN 105 #define MAXK 55 struct node { int len; int cnt[MAXK]; char b[MAXK]; }; static long long int C[MAXK][MAXK]; long long int ConvToNum (struct node comb) { long long int res = 0LL; int N, K, i; N = comb.len; K = 15; for (i = 15; i < N; i++) res += C[i][K]; for (i = 0; i < comb.len; i++) { if (comb.b[i]) { if (N != K) res += C[N-1][K]; N--; K--; } else { N--; } } return res; } void decode(int N, int L, int X[]) { C[0][0] = 1LL; int i, j; for (i = 1; i <= 50; i++) { C[i][0] = 1LL; for (j = 1; j < i; j++) C[i][j] = C[i-1][j-1] + C[i-1][j]; C[i][i] = 1LL; } int ac = (N+3)/4; struct node a[MAXN]; memset(a,0,sizeof(a)); for (i = 0; i < L; i++) { (a[X[i] / 16].cnt[X[i] % 16])++; } int now = 0; int nownum[4]; for (i = 0; i < ac; i++) { for (j = 0; j < 16; j++) { int k; for (k = 0; k < a[i].cnt[j]; k++) { a[i].b[a[i].len] = 0; (a[i].len)++; } a[i].b[a[i].len] = 1; (a[i].len)++; } (a[i].len)--; long long int num = ConvToNum(a[i]); for (j = 0; j < 4; j++) { nownum[j] = num % 256LL; num /= 256LL; } for (j = 0; j < 4; j++) { if (now < N) output(nownum[j]); now++; } } }
Private
[
?
]
Run code
Submit