hdu1880 hash算法学习
来源:互联网 发布:如何求最大公约数 算法 编辑:程序博客网 时间:2024/05/01 08:47
本题用的是bkdr算法,传说中java内置的hash就是这个实现的
unsigned int BKDRHash(char*str) { unsigned int seed=131 ;// 31 131 1313 13131 131313 etc.. unsigned int hash=0 ; while(*str) { hash=hash*seed+(*str++); } return(hash % M); }
这题我木有A,题解也没咋看懂,虽然网上都说该题很水,,附上保存防丢失。。
//bkdr hash模板#include <cstdio>#include <cstring>#include <cstdlib>#include <algorithm>using namespace std;const int MAX=210000;const int mod=100007;struct Node{Node* ne;char st[81];}hash[MAX],*h[mod],*cur;unsigned int BKDHash(char* s){unsigned int seed=131;unsigned int ret=0;while(*s){ret=ret*seed+*s++;}return (ret&0x7FFFFFFF)%mod;}int getId(char* s){int code=BKDHash(s);Node* ptr=h[code];while(ptr){if(strcmp(ptr->st,s)==0){return ptr-hash;}else{ptr=ptr->ne;}}strcpy(cur->st,s);cur->ne=h[code];h[code]=cur++;return cur-hash-1;}int find(char* s){int code=BKDHash(s);Node* ptr=h[code];while(ptr){if(strcmp(ptr->st,s)==0){return ptr-hash;}else{ptr=ptr->ne;}}return -1;}int main(){char s[100],*p;int id,n;cur=hash;memset(h,0,sizeof(h));while(scanf("%s",s),s[0]!='@'){getId(s);getchar();gets(s);getId(s);}scanf("%d",&n);gets(s);while(n--){gets(s);id=find(s);if(id==-1){puts("what?");}else{p=hash[id^1].st;if(p[0]!='['){puts(p);}else{p++;while(*p!=']'){putchar(*p++);}puts("");}}}return 0;}
对hash算法有兴趣的话,这里很全,,http://blog.csdn.net/hqd_acm/article/details/5901955
0 0
- hdu1880 hash算法学习
- HDU1880 字符串hash
- hdu1880 魔咒词典 (hash)
- hdu1880
- hdu1880
- hdu1880
- Hash表算法学习
- hash算法学习笔记
- Hash算法学习(1)
- Consistent Hash算法学习
- hash算法学习
- hash算法学习
- 一致性hash算法学习
- Hash算法学习笔记
- 一致性 Hash 算法学习
- 一致性Hash算法学习
- 【算法技术】Hash深入学习
- 算法学习 - Hash Table (Separate Chaining)
- linux命令后台运行
- 错误-Sql Server 备份数据库时提示“无法打开备份设备”
- yuv420sp-rgb24
- 数据库编程总结
- 用eclipse运行和部署myeclipse项目
- hdu1880 hash算法学习
- 2014多校联合五(HDU 4911 HDU 4915 HDU 4920)
- bin目录下hadoop脚本使用
- linux中poll用法
- KD-tree学习笔记
- 同网段地址判断
- ubuntu 12.04设置源
- 五子棋AI大赛
- hdu 1018 斯特灵公式