• 【哈希】身份证问题


    #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));
        }
    }
  • 相关阅读:
    随堂练习 shell脚本(五)
    随堂练习 shell脚本(四)
    随堂练习 shell脚本(三)
    马哥博客作业第五周
    JavaScript连载25-正则表达式的匹配分割替换以及贪婪模式
    Java连载130-JDBC编程初步
    C连载15-练习一波转换模式
    Android连载25-强制下线具体实现
    JavaScript连载24-正则表达式
    Java连载129-广播数据包、网络编程总结
  • 原文地址:https://www.cnblogs.com/lvcoding/p/8072469.html
Copyright © 2020-2023  润新知