输入样例:
4 500
330106199010080419 499
110108198403100012 15000
120104195510156021 800
330106199010080419 1
4
120104195510156021
110108198403100012
330106199010080419
33010619901008041x
代码:
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
using namespace std;
//用哈希函数处理客户身份证号,得到的相应id存入head[]数组里。
//head数组初始化为-1,
//建立一个链表p来存储客户信息(下标从0开始按顺序存储
//head数组用来存储相应id在p链表中存储的位置,同时也可表示该id的对应元素(值为-1时表示没有
//若存在冲突,则head[id]表示的是最后一个同id元素,p[m].next里存储上一元素的下标值
typedef long long ll;
const int maxn=1e5+7;//100007
int head[maxn];//函数初始化元素全为-1
struct Cus
{
char name[20];
int road;
int next;
}p[maxn];
int GetId(char *str)
{
ll res=0;//存储id的十进制数
for(int i=0;i<strlen(str);i++)
{
if(str[i]>='0'&&str[i]<='9')
//int isdigit(char c)函数检测c是否为0~9,头文件#include<ctype.h>
{
res=res*10+str[i]-'0';
}
else
{
res = res*10+10;
}
}
return (int)(res%maxn);//哈希函数
}
int cnt=0;
void Add_Node(char *str,int id,int temp)
{
int ok=1;
for(int i=head[id];i!=-1;i=p[i].next)
{
if(strcmp(str,p[i].name)==0)//不需要添加,若是已登记用户,直接加里程数
{
p[i].road+=temp;
ok=0;
}
//若为冲突
}
if(ok==1)//需要添加。如果该id无元素或发生了冲突
{
int i=0;
p[cnt].road+=temp;
for(i=0;str[i];i++)
{
p[cnt].name[i]=str[i];
}
p[cnt].name[i]='\0';//存入
p[cnt].next=head[id];//若发生冲突,next存上一元素的值
head[id]=cnt;//head[id]即为该id对应元素在p[]中的坐标值
cnt++;
}
}
int ToFind(char*str,int id)
{
for(int i=head[id];i!=-1;i=p[i].next)
//head[id]!=-1---head[id]不空
{
if(strcmp(str,p[i].name)==0)
{
cout<<p[i].road<<endl;
return 1;
}
}
return 0;
}
int main()
{
char str[20];
int n,k,temp;
cin>>n>>k;
memset(head,-1,sizeof(head));//初始化
for(int i=0;i<n;i++)
{
cin>>str>>temp;
if(temp<k)
temp=k;
int index=GetId(str);
Add_Node(str,index,temp);
}
int m;
cin>>m;
for(int i=0;i<m;i++)
{
cin>>str;
int index=GetId(str);
if(!ToFind(str,index))
{
cout<<"No Info"<<endl;
}
}
return 0;
}