Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define MAXL 5
- #define MAXF 10
- #define MAXU 10001
- #define MAXC 315
- #define NBIT sizeof(unsigned int) * 8
- unsigned int fStatus[MAXU][MAXC];
- int N = 0, C = 0, d = 0;
- void init(int n){
- d = NBIT;
- N = n, C = (n / d) + 1;
- for (int i = 0; i <= N; i++){
- for (int j = 0; j <= C; j++)
- fStatus[i][j] = 0;
- }
- }
- void add(int id, int F, int ids[MAXF]){
- int r1 = id / d, c1 = id % d;
- for (int i = 0; i < F; i++){
- int r2 = ids[i] / d, c2 = ids[i] % d;
- fStatus[id][r2] = (fStatus[id][r2] | (1 << c2));
- fStatus[ids[i]][r1] = (fStatus[ids[i]][r1] | (1 << c1));
- }
- }
- void del(int id1, int id2){
- int r1 = id1 / d, c1 = id1 % d;
- int r2 = id2 / d, c2 = id2 % d;
- fStatus[id1][r2] = (fStatus[id1][r2] ^ (1 << c2));
- fStatus[id2][r1] = (fStatus[id2][r1] ^ (1 << c1));
- }
- int recommend(int id, int list[MAXL]){
- int tmp[MAXL+ 1], fnd[MAXU], n = 0;
- for (int i = 1; i <= N; i++)
- fnd[i] = 0;
- for (int i = 0; i <= C; i++){
- if (fStatus[id][i]){
- for (int j = 0; j < 32; j++){
- if ((fStatus[id][i] & (1 << j))){
- int f = 32 * i + j;
- for (int k = 0; k <= C; k++){
- if (fStatus[f][k]){
- for (int l = 0; l < 32; l++){
- if (fStatus[f][k] & (1 << l)){
- int ff = 32 * k + l;
- fnd[ff]++;
- }
- }
- }
- }
- }
- }
- }
- }
- int r1 = id / d, c1 = id % d;
- for (int i = 1; i <= N; i++){
- int r2 = i / d, c2 = i % d;
- if (i == id || !fnd[i] || (fStatus[id][r2] & (1 << c2)))
- continue;
- tmp[n] = i;
- for (int j = n; j > 0; j--){
- if (fnd[i] > fnd[tmp[j - 1]]){
- int tp = tmp[j - 1];
- tmp[j - 1] = i;
- tmp[j] = tp;
- }
- }
- n = (n >= 5) ? n : n + 1;
- }
- for (int i = 0; i < 5 && i < n; i++)
- list[i] = tmp[i];
- return n;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement