10W 的字符串查询,据说 二分,map,sort 各种过,没有尝试,写的hash,自己的hash函数 TLE 了,搜了个 UNIX 用的处理字符函数……
真心弱爆了,一直以来,指针都没有理解透彻,真心渣渣……
Code:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define Mod 39917
#define N 12
#define M 100001
struct Word{
char name[N],shit[N];
}list[M];
struct Node{
char * name,* shit;
Node * next;
}word[Mod+10];
int ELFHash(char *key)// UNIX 系统ELF字符串散列函数,对字符串的处理一般使用此函数
{
unsigned long h=0;
while (*key){
h=(h<<4)+*key++;
unsigned long g=h & 0xf0000000L;
if (g) h^=g>>24;
h &= ~g;
}return h%Mod;
}
void insert(char *s1,char *s2){
int key=ELFHash(s2);
Node *newNode = new Node;
newNode->name=s1;
newNode->shit=s2;
newNode->next = word[key].next;
word[key].next = newNode;
}
void search(char *s){
int key=ELFHash(s);
Node *jobs = new Node;
jobs = word[key].next;
while(jobs != NULL){
if( strcmp(jobs->shit,s)==0 ){
printf("%s\n",jobs->name);return;
}
jobs = jobs->next;
}
printf("eh\n");
return;
}
int main()
{
int i=0;
char str[N],*tmp1,*tmp2,*fuck;
//指针 保存地址,指向一块内存,也就是说,它不能直接保存数据,如果想用指针标示
//一个数据的话,需要先给这个数据申请内存空间,然后用这个指针指向那块内存
while( gets(str) && str[0]!=0 ){
//好吧,我承认,我2B了,gets()是可以读入'\n'的,也就是说,空行的str长度是1,不是0
//我用 while(gets(str) && strlen(str)>0) 开开心心的WA到凌晨四点……
sscanf(str,"%s%s",&list[i].name,&list[i].shit);
tmp1=list[i].name; tmp2=list[i].shit;
insert(tmp1,tmp2);
i++;
}
while(gets(str)){
fuck=str;
search(fuck);
}
return 0;
}