【哈希】身份证问题

#include <stdio.h>
typedef struct node{
    char name[24];
    char id[19];
    int num;
    node * pre;
    node * next;
}node;
node nhs[100004];
node ihs[100004];
node ihspool[100004];
int iindex = 0;
node * getinew(){
    return &ihspool[iindex++];
}
node nhspool[100004];
int nindex = 0;
node * getnnew(){
    return &nhspool[nindex++];
}
int getikey(char id[19]){
    int x = 0;
    for (int i = 0; i <= 17; i++)
        x = (10 * x + (id[i] - '0')) % 100003;
    return x;
}
int getnkey(char name[24]){
    int x = 0;
    for (int i = 0; i <= 22; i++)
        x = (26 * x + (name[i] - 'A')) % 100003;
    return x;
}
void inserti(int key, node * newnode){
    node * head = &ihs[key];
    newnode->pre = head;
    newnode->next = head->next;
    head->next = newnode;
    newnode->next->pre = newnode;
    head->num++;
}
void insertn(int key, node * newnode){
    node * head = &nhs[key];
    newnode->pre = head;
    newnode->next = head->next;
    head->next = newnode;
    newnode->next->pre = newnode;
    head->num++;
}
void init(){
    for (int i = 0; i <= 100003; i++){
        ihs[i].pre = &ihs[i];
        ihs[i].next = &ihs[i];
        ihs[i].num = 0;
        nhs[i].pre = &nhs[i];
        nhs[i].next = &nhs[i];
        nhs[i].num = 0;
    }
}
bool isame(char a[19], char b[19]){
    int flag = true;
    for (int i = 0; i <= 17; i++){
        if (a[i] != b[i]){
            flag = false;
            break;
        }
    }
    return flag;
}
bool nsame(char a[24], char b[24]){
    int flag = true;
    for (int i = 0; i <= 22; i++){
        if (a[i] != b[i]){
            flag = false;
            break;
        }
    }
    return flag;
}
node * searchi(char a[19]){
    int key = getikey(a);
    int x = ihs[key].num;
    node * y = &ihs[key];
    while (x--){
        y = y->next;
        if (isame(a, y->id)) return y;
    }
}
int searchn(char name[24]){
    int key = getnkey(name);
    int x = nhs[key].num;
    node * y = &nhs[key];
    int num = 0;
    while (x--){
        y = y->next;
        if (nsame(name, y->name)) num++;
    }
    return num;
}
int main(){
    freopen("input.txt", "r", stdin);
    freopen( "result.txt","w",stdout);
    init();
    for (int i = 1; i <= 100000; i++){
        node * newnode=getinew();
        scanf("%s %s", newnode->name,newnode->id);
        int key = getikey(newnode->id);
        inserti(key, newnode);
        node * newnnode = getnnew();
        for (int i = 0; i <= 17; i++)
            newnnode->id[i] = newnode->id[i];
        for (int i = 0; i <= 22;i++)
            newnnode->name[i] = newnode->name[i];
        key = getnkey(newnnode->name);
        insertn(key, newnnode);
    }
    char id[19];
    for (int i = 1; i <= 100000; i++){
        scanf("%s", &id);
        node * newnode = searchi(id);
        printf("%s\n",newnode->name);
    }
    char name[24];
    for (int i = 1; i <= 100000; i++){
        scanf("%s", &name);
        printf("%d\n", searchn(name));
    }
}

 

posted @ 2017-12-20 10:31  Mr.Struggle  阅读(468)  评论(0编辑  收藏  举报