zoukankan      html  css  js  c++  java
  • 【哈希】身份证问题

    #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
    ",newnode->name);
        }
        char name[24];
        for (int i = 1; i <= 100000; i++){
            scanf("%s", &name);
            printf("%d
    ", searchn(name));
        }
    }
  • 相关阅读:
    LeetCode Count of Range Sum
    LeetCode 158. Read N Characters Given Read4 II
    LeetCode 157. Read N Characters Given Read4
    LeetCode 317. Shortest Distance from All Buildings
    LeetCode Smallest Rectangle Enclosing Black Pixels
    LeetCode 315. Count of Smaller Numbers After Self
    LeetCode 332. Reconstruct Itinerary
    LeetCode 310. Minimum Height Trees
    LeetCode 163. Missing Ranges
    LeetCode Verify Preorder Serialization of a Binary Tree
  • 原文地址:https://www.cnblogs.com/lvcoding/p/8072469.html
Copyright © 2011-2022 走看看