题目:

思路:

如果直接暴力搜索的话,时间复杂度为O(n*m),在n为百万量级的情况下,必然是T。
所以,这里通过hash函数,将字符串转换为对应的hash值;同时利用邻接表避免了hash冲突,方法是用head[hashval]存储指向一个相同hash值的单链表的指针(这里指的是相当于一个头指针),如果一个字符串得到的hash值在之前出现过,则加入单链表;最后在查找的时候,只需要找字符串对应hash值的单链表即可。

注意:(1)在建立邻接表的时候,新插入的节点不断加入到链表的首部,这样在查询的时候,刚好是相反的。(2)hash函数选用IndexHash。

时间复杂度O(n)。

代码:

//
//  main.cpp
//  searchme
//
//  Created by wasdns on 16/12/12.
//  Copyright © 2016年 wasdns. All rights reserved.
//#include <iostream>
#include <cstdio>
#include <cstring>
#define mod 999983                          //int范围内取最大的素数
#define maxn 1000005
using namespace std;/*Hash函数:IndexHash*/int IndexHash(char *s)
{int hashval = 0;while (*s != '\0') {hashval = (hashval << 5) + *s++;}return hashval % mod;
}char searchname[maxn][10];                  //你的名字int head[maxn];                             //邻接表的头数组int lnext[maxn];                            //邻接表的节点数组int tot = 1;                                //第tot个字符串/*AddNode创建邻接表函数:在head[hashval]中存指向单链表的指针插入时,现有head的值存入lnext[tot]之后使head[hashval]成为新的节点相当于不断在链表的首部进行插入*/void AddNode(int hashval)
{lnext[tot] = head[hashval];head[hashval] = tot;tot++;
}/*询问函数:通过IndexHash得到hash值利用head[hashval]找到指向对应hash值的单链表遍历单链表,找到 -> 计数器++。*/void query(int q)
{int cnt = 0;for (int i = 1; i <= q; i++){int hashval = 0;char findname[10];scanf("%s", findname);hashval = IndexHash(findname);for (int j = head[hashval]; j != -1; j = lnext[j]){if (strcmp(searchname[j], findname) == 0) {cnt++;}}}printf("%d\n", cnt);
}int main()
{memset(head, -1, sizeof(head));memset(lnext, -1, sizeof(lnext));int n, m;cin >> n >> m;int i;for (i = 1; i <= n; i++){scanf("%s", searchname[i]);int hashval = IndexHash(searchname[i]);AddNode(hashval);}cout << endl;query(m);return 0;
}

2016/12/12

DS实验题 Searchname相关推荐

  1. DS实验题 融合软泥怪-2 Heap实现

    题目和STL实现:DS实验题 融合软泥怪-1 用堆实现优先队列 引言和堆的介绍摘自:Priority Queue(Heaps)--优先队列(堆) 引言: 优先队列是一个至少能够提供插入(Insert) ...

  2. DS实验题 Inversion

    题目: 解题过程: 第一次做这题的时候,很自然的想到了冒泡和选择,我交的代码是用选择写的.基本全WA(摊手). 贴上第一次的代码: // // main.cpp // sequenceschange ...

  3. DS实验题 击鼓传花

    题目: 代码1(数组实现): // // main.cpp // DS-击鼓传花 // // Created by wasdns on 16/11/9. // Copyright © 2016年 wa ...

  4. DS实验题 Floyd最短路径 Prim最小生成树

    题目: 提示: Floyd最短路径算法实现(未测试): // // main.cpp // Alg_Floyd_playgame // // Created by wasdns on 16/11/19 ...

  5. DS实验题 融合软泥怪-1

    题目 思路 很容易想到第一种做法,用Huffman算法,从森林中找出两个值最小的节点,合并再加入森林,在这个过程中不断记录. 但是每一次需要sort一遍,将最小的两个值节点置于头两个节点,最坏情况下复 ...

  6. 小孩的游戏 - 2021数据结构 排序和选择实验题

    小孩的游戏 - 2021数据结构 排序和选择实验题 pre 做都做了, 干脆发上来算了 : D 题目分析 算法与数据结构实验题 5.18 小孩的游戏 ★实验任务 一群小孩子在玩游戏,游戏规则是这样子, ...

  7. 数值分析上机题matlab线性方程组,数值分析上机实验报告 - 线性方程组部分实验题1...

    s=A(i,(i+1):n)*x((i+1):n,1); else s=0; end x(i,1)=(b(i)-s)/A(i,i);end %Cholosky分解方法***************** ...

  8. SSLGET ×××综合实验题

    SSL&GET ×××综合实验题 1.网络拓扑 2.网络需求 KS与Inside1.Inside2.DMZ2建立GET ×××,ASA对外提供SSL ×××. 3.具体配置 KS: ip do ...

  9. 2021年春季学期-信号与系统-第七次作业参考答案-MATLAB实验题

    本文是 2021年春季学期-信号与系统-第七次作业参考答案 的小题的参考答案. ▌MATLAB 实验题 ▌ 在网络学堂下载一段音乐及其经过处理后的音乐数据文件,聆听相应的音频效果.使用在MATLAB中 ...

  10. 2021年春季学期-信号与系统-第四次作业参考答案-MATLAB实验题2

    本文是 2021年春季学期-信号与系统-第四次作业参考答案 的内容. ▌MATLAB实验题2 2. 回声的模拟与消除 在山间,或者洞穴中说活,会听到回声,这是声音在相距较远的山壁之间来回反射传播产生的 ...

最新文章

  1. 某小公司:MySQL连环问
  2. C# 获取指定进程的主窗口句柄
  3. leetcode算法题--视频拼接
  4. 统计学习:协方差和相关性
  5. 判断一个数是否是2的幂
  6. Java Spring log源代码学习
  7. C语言中open与fopen的的解释和区别
  8. GCC9.2/Python3.8/Libvirt6.0/QEMU4.2 编译/配置/安装
  9. jtextpane设置不能选中_你会设置数据有效性吗?
  10. dense sift matlab,一个 Dense SIFT 算法的 matlab 实现 | 学步园
  11. linux常用命令(1)——文件管理
  12. matlab多图形相交,用MATLAB作出柱面x^2+y^2=4 和柱面x^2+z^2=4 相交的图形.
  13. 数据集(三)|人工智能领域100+数据集分享,赶紧收藏!
  14. 【STM32标准库】【自制库】8位8段数码管(74HC595)【软件部分】
  15. STM32 ESP8266 无线模块使用
  16. ElasticSearch之别名_aliases
  17. 智能合约隐私计算之同态加密应用举例
  18. 日本股市大跌5.2% 日元创16年新高
  19. PGP 对于JSON的加解密
  20. OSPF高级配置——学习OSPF路由协议的高级应用

热门文章

  1. 何为创新型人才,创新型公司?
  2. Java:集合,Map接口框架图
  3. 密码需要带特殊字符(二)
  4. 《Unix环境高级编程》学习笔记
  5. java mail(转贴)//从哪里找到忘记了,不过绝对不是自己写的
  6. 078 numpy模块
  7. Docker 架构(二)【转】
  8. http缓存与cdn相关技术
  9. bzoj 4026 dC Loves Number Theory(主席树)
  10. Fedora23 安装 psycopg2