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));
        }
    }
  • 相关阅读:
    题解:[HNOI2004]树的计数
    题解:砝码称重
    题解:子矩阵(NOIP2014普及组T4)
    题解:低价购买
    题解:倍增三连击orz
    题解:UVA10140 Prime Distance
    题解:[JSOI2007]建筑抢修
    模板:三分法
    Databinging数据绑定
    开始
  • 原文地址:https://www.cnblogs.com/lvcoding/p/8072469.html
Copyright © 2011-2022 走看看