人生的第一次hash交给了模板题。

讲道理,还没有别人快排要快,就比暴力快那么一点。。。

难道我写的hash就那么菜么?

我想了想,光是处理字符串就O(n*len)。。

这是hash的正确写法吗?我都开始怀疑自己了。

不管怎样,把代码附上,以后可能会用。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <cmath>
  5.  
  6. using namespace std;
  7.  
  8. int n;
  9. string h[], s;
  10.  
  11. const int mod = ;
  12.  
  13. long long hash()
  14. {
  15. int i, len = s.length() - ;
  16. long long ans = ;
  17. for(i = ; i <= len; i++) ans = ans * + s[i] - 'a';
  18. ans = abs(ans);
  19. ans %= mod;
  20. return ans;
  21. }
  22.  
  23. bool insert()
  24. {
  25. long long i = hash();
  26. while(h[i] != s && h[i] != "") i++;
  27. if(h[i] == s) return ;
  28. h[i] = s;
  29. return ;
  30. }
  31.  
  32. int main()
  33. {
  34. int i, j, ans = ;
  35. scanf("%d", &n);
  36. getline(cin, s);
  37. for(i = ; i <= n; i++)
  38. {
  39. getline(cin, s);
  40. if(insert()) ans++;
  41. }
  42. printf("%d", ans);
  43. return ;
  44. }

学习了别人的写法,200ms,感觉这才是正确姿势。

原来的我还是太naive了。

  1. #include <cstdio>
  2. #include <cstring>
  3. #define ULL unsigned long long
  4.  
  5. const int MAXN = , p = ;
  6. int n, ans, cnt;
  7. int head[MAXN], next[MAXN];
  8. ULL val[MAXN];
  9. char s[MAXN];
  10.  
  11. inline bool insert(ULL x)
  12. {
  13. int i, a = x % p;
  14. for(i = head[a]; i != -; i = next[i])
  15. if(val[i] == x)
  16. return ;
  17. val[cnt] = x;
  18. next[cnt] = head[a];
  19. head[a] = cnt++;
  20. return ;
  21. }
  22.  
  23. inline void ha()
  24. {
  25. int i, len = strlen(s);
  26. ULL hash = ;
  27. for(i = ; i < len; i++) hash = hash * + s[i];
  28. ans += insert(hash);
  29. }
  30.  
  31. int main()
  32. {
  33. int i;
  34. memset(head, -, sizeof(head));
  35. scanf("%d", &n);
  36. while(n--)
  37. {
  38. scanf("%s", s);
  39. ha();
  40. }
  41. printf("%d", ans);
  42. return ;
  43. }

人生第一次hash的更多相关文章

  1. 仅仅使用Google就完成了人生第一次破解

    2021年2月6日21:17:09 begin 起因 在异乡的打工人,不善言谈,幸有一老同学,周末常邀吃饭,感恩之心铭记于心.她结婚时,为表心意欲做视频,视频需要制作字幕,搜索之,偶遇一字幕软件,但是 ...

  2. mac下的改装人生——第一次拆卸mbp,加入内存

    这是我第一次拆我的mbp哈,心情无比激动. 在家门口电脑维修店的老板那里借来了螺丝刀.回家以后立刻开始了改装行动 我的MC700后盖是可以全部打开的,总共大概是10个螺丝的样子,上面靠右边的三颗是长螺 ...

  3. 人生第一次JAVA编程,电梯(并不算完成版),以及IDEA里使用git

    首先先说说Intellij IDEA与git的互联,首先在任意(我是在coding)gitlab里新建一个工程. 然后新建一个工程记得注明url和地址.名称等 如果无法创建,则需要指定git地址 创建 ...

  4. 人生第一次成功的sql注入

    看了一些学习视频,按着大神们的教程,搜索inurl:asp?id=,结果一个可以注入的站点都找不到,绝望. 不放弃,又找啊找,找啊找,终于找到了一个! 啦啦啦,注入点!ヾ(o◕∀◕)ノヾ!! 再来查数 ...

  5. Docker安装 人生第一次

    Ubuntu 系列安装 Docker 通过系统自带包安装 Ubuntu 14.04 版本系统中已经自带了 Docker 包,可以直接安装. $ sudo apt-get update $ sudo a ...

  6. 人生第一次研读MFC截图工具的笔记心得

    截图工具: 其中用到了动态链接库DLL技术(Dynamic Link Library)技术,键盘钩子技术,光标捕获技术,类橡皮类CRectTracker 头文件:后缀名为.cpp,主要是定义和声明之类 ...

  7. Java8 Hash改进/内存改进

    又开新坑o(*≧▽≦)ツ讲讲几个Java版本的特性,先开始Java8, HashMap的改进 HashMap采用哈希算法,先使用hashCode()判断哈希值是否相同,如果相同,再使用equals() ...

  8. hash bucket

    什么是bucket bucket的英文解释: Hash table lookup operations are often O(n/m) (where n is the number of objec ...

  9. ConcurrentHashMap原理分析(1.7与1.8)-put和 get 需要执行两次Hash

    ConcurrentHashMap 与HashMap和Hashtable 最大的不同在于:put和 get 两次Hash到达指定的HashEntry,第一次hash到达Segment,第二次到达Seg ...

随机推荐

  1. 2017-3-10 SQL server 数据库 T--SQL语句

    创建数据库:create datebase  数据库名     注:数据库名不能为中文,不能数字开头,不能符号开头. 删除数据库:drop datebase 数据库名 创建表:create   tab ...

  2. Isomorphic Strings leetcode

    Given two strings s and t, determine if they are isomorphic. Two strings are isomorphic if the chara ...

  3. swift -- 集合

    swift -- 集合 //注意:集合中的元素是无序的,并且不想数组,字典那样,没有索引和键. 1.创建一个空集合 var set1 : Set<Int> = Set<Int> ...

  4. Uri API

    四中LaunchMode:http://blog.csdn.net/liuhe688/article/details/6754323 onNewIntent:http://www.cnblogs.co ...

  5. elastic search 学习 一

    初步阅读了elastic search 的文档,并使用command实践操作. 大概明白其概念模型.

  6. WPF: 在 MVVM 设计中实现对 ListViewItem 双击事件的响应

    ListView 控件最常用的事件是 SelectionChanged:如果采用 MVVM 模式来设计 WPF 应用,通常,我们可以使用行为(如 InvokeCommandAction)并结合命令来实 ...

  7. java中的对象

    对象                     --计算机语言中的对象 通常,我们可以从一般事物的三个方面,去认识事物: 一.是什么? 二.为什么? 三.怎么样? 接下来,我们也利用这三个方面的思维,去 ...

  8. 《Django By Example》第十二章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:第十二章,全书最后一章,终于到这章 ...

  9. response.getWriter().write()与out.print()的区别(转)

    1.首先介绍write()和print()方法的区别:  (1).write():仅支持输出字符类型数据,字符.字符数组.字符串等  (2).print():可以将各种类型(包括Object)的数据通 ...

  10. java web中cookies的用法 转

    一.什么是cookies? 大家都知道,浏览器与WEB服务器之间是使用HTTP协议进行通信的,当某个用户发出页面请求时,WEB服务器只是简单的进行响应,然后就关闭与该用户的 连接.因此当一个请求发送到 ...