利用双hash来存储,之后利用二分来查找,复杂度O(nlogn)。就是难写了点,可能使用lower_bound会好一点

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int INF = 1e7+7;
#define N 101000
struct NODE
{char name[22];char spell[88];
}a[N];
struct haxi
{int x,y;int x1,y1;int num;
}b[N],d[N];
int a_len;
bool cmp(haxi a,haxi b)
{if(a.x==b.x)return a.y<b.y;elsereturn a.x<b.x;
}
bool cmp1(haxi a,haxi b)
{if(a.x1==b.x1)return a.y1<b.y1;elsereturn a.x1<b.x1;
}
haxi hash_fange(char *s,int len)
{int j;int tmp,tmp1;tmp=0;tmp1=0;for(j=0;j<len;j++){tmp=tmp*131+s[j];tmp1=tmp1*141+s[j];tmp%=INF;tmp1%=INF;}haxi temp;temp.x=tmp;temp.y=tmp1;return temp;
}
void init()
{a_len=0;int i,len;char c;char tmp[100];while(scanf("%s",tmp)!=EOF){if(tmp[0]=='@')break;else{len=strlen(tmp);for(i=1;i<len-1;i++)a[a_len].name[i-1]=tmp[i];a[a_len].name[len-2]='\0';}getchar();i=0;while((c=getchar())!='\n'){a[a_len].spell[i++]=c;}a[a_len].spell[i]='\0';a_len++;}//以上为输入//for(i=0;i<a_len;i++){haxi temp;temp=hash_fange(a[i].name,strlen(a[i].name));d[i].x=temp.x;d[i].y=temp.y;temp=hash_fange(a[i].spell,strlen(a[i].spell));d[i].x1=temp.x;d[i].y1=temp.y;d[i].num=i;b[i]=d[i];}//以上为hash//sort(b,b+a_len,cmp);sort(d,d+a_len,cmp1);
}
void found(haxi x)
{int l=0,r=a_len-1,mid;while(l<=r){mid=(l+r)/2;if(x.x==b[mid].x){if(x.y<=b[mid].y){if(x.y==b[mid].y){printf("%s\n",a[b[mid].num].spell);return;}elser=mid-1;}elsel=mid+1;}else{if(x.x<b[mid].x)r=mid-1;elsel=mid+1;}}printf("what?\n");
}
void found_1(haxi x)
{int l=0,r=a_len-1,mid;while(l<=r){mid=(l+r)/2;if(x.x1==d[mid].x1){if(x.y1<=d[mid].y1){if(x.y1==d[mid].y1){printf("%s\n",a[d[mid].num].name);return;}elser=mid-1;}elsel=mid+1;}else{if(x.x1<d[mid].x1)r=mid-1;elsel=mid+1;}}printf("what?\n");
}
void solve()
{char s[110];char c;int n,len;haxi temp;scanf("%d",&n);getchar();while(n--){c=getchar();if(c=='['){scanf("%s",s);getchar();len=strlen(s);s[len-1]='\0';len--;temp=hash_fange(s,len);found(temp);}else{len=0;s[len++]=c;while((c=getchar())!='\n'){s[len++]=c;}s[len]='\0';temp=hash_fange(s,len);temp.x1=temp.x;temp.y1=temp.y;found_1(temp);}}
}
int main()
{
//    freopen("in.txt","r",stdin);init();solve();
//    for(int i=0;i<a_len;i++)
//        printf("%s %s\n",a[i].name,a[i].spell);return 0;
}

by:fange

HDU 1880 魔咒词典(字符串hash)相关推荐

  1. hdu 1880 魔咒词典

    魔咒词典 Time Limit: 8000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  2. 杭电acm 1880魔咒词典(水题)

    魔咒词典 Time Limit: 8000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  3. 字符串哈希(魔咒词典hdu1880)

    魔咒词典(字符串哈希) 哈利波特在魔法学校的必修课之一就是学习魔咒.据说魔法世界有100000种不同的魔咒,哈利很难全部记住,但是为了对抗强敌,他必须在危急时刻能够调用任何一个需要的魔咒,所以他需要你 ...

  4. ccf练习-魔咒词典(字符串分割,<map>存储)

    [问题描述] 哈利波特在魔法学校的必修课之一就是学习魔咒.据说魔法世界有100000种不同的魔咒,哈利很难全部记住,但是为了对抗强敌,他必须在危急时刻能够调用任何一个需要的魔咒,所以他需要你的帮助. ...

  5. 『杭电1880』魔咒词典

    Problem Description 哈利波特在魔法学校的必修课之一就是学习魔咒.据说魔法世界有100000种不同的魔咒,哈利很难全部记住,但是为了对抗强敌,他必须在危急时刻能够调用任何一个需要的魔 ...

  6. 魔咒词典---哈希+二分

    题目: 哈利波特在魔法学校的必修课之一就是学习魔咒.据说魔法世界有100000种不同的魔咒,哈利很难全部记住,但是为了对抗强敌,他必须在危急时刻能够调用任何一个需要的魔咒,所以他需要你的帮助. 给你一 ...

  7. HDU1880 魔咒词典【文本处理】

    魔咒词典 Time Limit: 8000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissi ...

  8. 魔咒词典(C/C++)

    题目描述 哈利波特在魔法学校的必修课之一就是学习魔咒.据说魔法世界有100000种不同的魔咒,哈利很难全部记住,但是为了对抗强敌,他必须在危急时刻能够调用任何一个需要的魔咒,所以他需要你的帮助.    ...

  9. 湖南大学21夏训练三3.魔咒词典

    [问题描述] 哈利波特在魔法学校的必修课之一就是学习魔咒.据说魔法世界有100000种不同的魔咒,哈利很难全部记住,但是为了对抗强敌,他必须在危急时刻能够调用任何一个需要的魔咒,所以他需要你的帮助. ...

  10. C++映射——魔咒词典

    题目描述 哈利波特在魔法学校的必修课之一就是学习魔咒.据说魔法世界有100000种不同的魔咒,哈利很难全部记住,但是为了对抗强敌,他必须在危急时刻能够调用任何一个需要的魔咒,所以他需要你的帮助.    ...

最新文章

  1. 双系统如何删除Linux
  2. 大写“惨”?三次改变世界、却被无情出局的程序员大牛!
  3. elasticsearch使用优化备忘
  4. 信息学奥赛一本通C++语言——1014:与圆相关的计算
  5. 《SolidWorks 2013中文版完全自学手册》——2.5 添加几何关系
  6. 新加坡大数据初创公司 Latize 获 150 万美元风险融资
  7. Maven仓库—Nexus环境搭建及使用
  8. androidgpuimage_基于GPUImage的实时美颜滤镜
  9. 智能传感器芯片行业下游市场应用前景分析预测及市场需求结构分析
  10. 做视频直播时如何测试本地网络的上行带宽(网速测试)
  11. Domain Impression A Source Data Free Domain Adaptation Method
  12. python实现10进制转换2进制(两种方法)
  13. 【python机器学习】普通最小二乘法多元线性回归
  14. 【转载】STM32的全部AltiumDesigner元件库文件
  15. Hbuilder x想调试时却无法检测到IOS手机,但是安卓手机能检测到,这里有解决方案
  16. 大数据给物流带来了什么?
  17. 程序员求职之道(《程序员面试笔试宝典》)之走进微软
  18. Android7.1电池管理部分的一些笔记
  19. 28岁转行学习Android开发,大器如何晚成?
  20. 分享Python采集77个VB源码,总有一款适合您

热门文章

  1. Mendix APP在腾讯云部署说明文档
  2. 什么是模拟信号?什么是数字信号
  3. 数据库原理与应用(何玉洁 第四版)第六章课后题答案
  4. 需求与商业模式创新-4-战略
  5. Draco使用笔记(1)——图形解压缩
  6. html加载fbx模型,[Unity菜鸟] FBX模型动画提取
  7. springboot基于微信小程序的宿舍管理系统毕业设计源码
  8. Gmail上不去怎么办?
  9. Scanvenger游戏制作笔记(九)Unity3D创建声音
  10. 用计算机处理表格信息教案,表格信息的加工与表达教案