[ create a new paste ] login | about

Link: http://codepad.org/LRPxss39    [ raw code | fork ]

C++, pasted on Nov 9:
#include <bits/stdc++.h>
#define SZ(X) ((int)(X).size())
#define ALL(X) (X).begin(), (X).end()
#define REP(I, N) for (int I = 0; I < (N); ++I)
#define REPP(I, A, B) for (int I = (A); I < (B); ++I)
#define RI(X) scanf("%d", &(X))
#define RII(X, Y) scanf("%d%d", &(X), &(Y))
#define RIII(X, Y, Z) scanf("%d%d%d", &(X), &(Y), &(Z))
#define DRI(X) int (X); scanf("%d", &X)
#define DRII(X, Y) int X, Y; scanf("%d%d", &X, &Y)
#define DRIII(X, Y, Z) int X, Y, Z; scanf("%d%d%d", &X, &Y, &Z)
#define RS(X) scanf("%s", (X))
#define CASET int ___T, case_n = 1; scanf("%d ", &___T); while (___T-- > 0)
#define MP make_pair
#define PB push_back
#define MS0(X) memset((X), 0, sizeof((X)))
#define MS1(X) memset((X), -1, sizeof((X)))
#define LEN(X) strlen(X)
#define F first
#define S second
typedef long long LL;
using namespace std;
const int SIZE = 100000;
char s[SIZE];
int main(){
    int n;
    FILE *fp = fopen("input.in","r");
    fgets(s,SIZE,fp);
    n=atoi(s);
    do{
        for(int i=0;s[i]!='\n'&&s[i];i++){
            if(s[i]!=' ' && (s[i] < '0' || s[i] > '9')){
                fprintf(stderr,"your input is so strange.");
                return 0;
            }
        }
    }while(fgets(s,SIZE,fp));
    fclose(fp);
    if((n&(n-1)) || n <= 1){
        fprintf(stderr,"n should be power of 2 and large than 1.\n");
        return 0;
    }
    // in i-th pass(0 base), we only consider numbers belong some masks of lowest i+1 bits
    set<int>consider;
    consider.insert(0);
    consider.insert(1);
    //pass log_n time
    for(int i=0;(1<<i)<n;i++){
        fp=fopen("input.in","r");
        fscanf(fp,"%*d");
        int mask=(1<<(i+1))-1;
        int x;
        map<int,int>num;
        map<int,int>xr;
        //read all numbers
        while(fscanf(fp,"%d",&x) == 1 && consider.size() != 0){
            if(x<0||x>=n){
                fprintf(stderr,"all number should be between 0 and n-1, inclusive.\n");
                return 0;
            }
            int cat=x&mask;
            if(consider.count(cat)){
                xr[cat]^=x;           //calculate xor of all number belong this mask category
                num[cat]++;           //calculate numbers of number belong this mask category
            }
        }

        int desired_number=1<<(n-i-1);
        set<int>nxt;
        for(set<int>::iterator it=consider.begin();it!=consider.end();it++){
            int cat = *it;
            if(num[cat] == 0){                                         // if this mask category contains no number, print all
                for(int number=cat;number<n;number+=1<<(i+1))printf("%d\n",number);
            }
            else if(desired_number == num[cat]+1){                     // if this mask category miss exact one number, print it
                int res=xr[cat];
                for(int number=cat;number<n;number+=1<<(i+1))res^=number;
                printf("%d\n",res);
            } 
            else if(num[cat] < desired_number){                        // otherwise, it become two mask category in next pass
                nxt.insert(cat);
                nxt.insert(cat|(1<<(i+1)));
            }
        }
        consider=nxt;
        fclose(fp);
    }
    return 0;
}
/*
 * in  any time of process, the number of mask categories will no more than O(k), so the Space Complexity is O(k)
 */


Create a new paste based on this one


Comments: