博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【哈希】身份证问题
阅读量:7254 次
发布时间:2019-06-29

本文共 2889 字,大约阅读时间需要 9 分钟。

#include 
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)); }}

 

转载于:https://www.cnblogs.com/lvcoding/p/8072469.html

你可能感兴趣的文章
Android系统开发(1)——GCC编译器的编译和安装过程
查看>>
详解Python模块导入方法
查看>>
mysql一些权限相关操作,数据库可以远程连接或者说用IP地址可以访问
查看>>
关于c#(vs)dategridview控件继承不能修改的问题
查看>>
JAVA通过使用sort方法排序
查看>>
跨域CORS 、第二章
查看>>
一秒去除Win7快捷方式箭头
查看>>
Linux上Simplescalar/ARM的安装和运行文档
查看>>
中断是CPU的机制
查看>>
DoD and DoR
查看>>
golang 资源
查看>>
关于FileFOutputStream应用中的FileNotFoundException问题
查看>>
[产品设计] - 设计理念
查看>>
关于gitblit成功启动,但在阿里云外网地址无法访问的问题
查看>>
C++访问MySql
查看>>
1056. 组合数的和(15)
查看>>
Git基础教程(一)
查看>>
css解决select下拉表单option高度的办法
查看>>
「洛谷P1198」 [JSOI2008]最大数 解题报告
查看>>
C# 里EF 对Mysql DB更新,乱码
查看>>