網頁

2013年8月18日 星期日

c012: Tell me the frequencies! 、UVA 10062

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define max 1005 

void eli_fgets_newline(char *line){
    char *pos;
    if ((pos=strrchr(line, '\n')) != NULL)
            *pos = '\0';
    if ((pos=strrchr(line, '\r')) != NULL)
        *pos = '\0';
    return ;
}

int binary_search(int db[max][2], int db_size, int c){
    int left = 0 ;
    int right = db_size-1;
    while(left<=right){
        int middle = (left+right)/2 ;
        if(db[middle][0] == c)
            return middle ;
        else if(db[middle][0] > c)
            right = middle-1 ;
        else
            left = middle+1 ;
    }
    return -1 ;
}

int compare(const void* a, const void* b){
    if(*((int*)a+1) != *((int*) b+1))
        return *((int*)a+1)-*((int*)b+1) ;
    else
        return *(int*)b-*(int*)a ;
}

int cmp(const void* a, const void* b){
    return *(int*)a-*(int*)b ;
}

void print_db(int db[max][2], int db_size){
    int i ;
    for(i=0 ; i<db_size ; ++i){
        printf("%d %d\n",db[i][0],db[i][1]) ;
    }
    puts("") ;
    return ;
}

int main(){
    char line[max] ;
    int db[max][2] ;
    int i, found ;
    int len = 0, db_size = 0;

    while(fgets(line,sizeof(line),stdin)){
        eli_fgets_newline(line) ;
        db_size = 0, memset(db,0,sizeof(db)) ;

        len = strlen(line) ;
        for(i=0 ; i<len ; ++i){
            qsort(db,db_size,sizeof(db[0]),cmp) ;
            found = binary_search(db,db_size,line[i]) ;
            if(found == -1){
                db[db_size][0] = line[i] ;
                db[db_size][1]++ ;
                db_size++ ;
            }
            else{
                db[found][1]++ ;
            }
        }
        qsort(db, db_size, sizeof(db[0]), compare) ;
        print_db(db,db_size) ;
    }

    return 0 ;
}

沒有留言:

張貼留言