哈希

题意简短:单case,输入一列单词即一个字典,已经按字典序排好输入,上限为120000,然后要你找一些单词,这种单词可以分为两部分,两部分都是字典里面的单词,按字典序输出这种单词

很裸的哈希,对于每个单词,将其分成两部分,一共有len中分法,然后去查找是否都在字典中,如果都在字典中就输出(因为输入已经按字典序排好,扫描时直接扫下来就可以了,找到合适的就输出)

问题的关键就转变为,给你一个单词,怎么判断这个单词是不是在字典中,用哈希就可以快速判断到。输入时随便将每个单词都用哈希函数映射掉,每得到要查询的单词也直接映射过去查找

处理冲突的方法是链表(静态链表数组模拟)

用了BKDHash函数在处理字符串的映射

BKDHash,40ms

#include <cstdio>
#include <cstring>
#define N 120000
#define LEN 110
#define P 0x7fffffffint n,tot;
char word[N+10][LEN];
int head[N+10];
struct list
{int n;int next;
}e[N+10];void add(unsigned int index ,int m)
{e[tot].n = m;e[tot].next = head[index];head[index] = tot++;
}unsigned int BKDHash(char *str)
{unsigned int seed = 131;unsigned int hash = 0;int len = strlen(str);for(int i=0; i<len; i++)hash = hash * seed + str[i];return (hash & P) % N;
}int find(char *str)
{unsigned int index = BKDHash(str);for(int k=head[index]; k!=-1; k=e[k].next){int m = e[k].n;if(!strcmp(word[m] , str))return k;}return -1;
}int main()
{n = tot = 0;memset(head,-1,sizeof(head));while(scanf("%s",word[n])!=EOF){unsigned int index = BKDHash(word[n]);add(index , n);n++;}for(int i=0; i<n; i++){char str1[LEN] , str2[LEN];int len = strlen(word[i]);for(int j=0; j<len-1; j++){int k,kk;for(k=0,kk=0; kk<=j; k++,kk++)str1[k] = word[i][kk];str1[k] = '\0';for(k=0,kk=j+1; kk<len; k++,kk++)str2[k] = word[i][kk];str2[k] = '\0';int ok[2];ok[0] = find(str1);ok[1] = find(str2);if(ok[0] != -1 && ok[1] != -1){printf("%s\n",word[i]);break;}}}return 0;
}

自己瞎比比写的一个字符串哈希,冲突死了,200ms

#include <cstdio>
#include <cstring>
#define N 120000
#define LEN 110int n,tot;
char word[N+10][LEN];
int head[N+10];
struct list
{int n;int next;
}e[N+10];void add(int index ,int m)
{e[tot].n = m;e[tot].next = head[index];head[index] = tot++;
}int Hash(int m)
{int len = strlen(word[m]);int sum = 0;for(int i=0; i<len ; i++)sum += (word[m][i] - 'a')*i;return sum%N;
}int find(char *str)
{int len = strlen(str);int sum = 0;for(int i=0; i<len ;i++)sum += (str[i] - 'a')*i;int index = sum%N;for(int k=head[index]; k!=-1; k=e[k].next){int m = e[k].n;if(!strcmp(word[m] , str))return k;}return -1;
}int main()
{n = tot = 0;memset(head,-1,sizeof(head));while(scanf("%s",word[n])!=EOF){int index = Hash(n);add(index , n);n++;}for(int i=0; i<n; i++){char str1[LEN] , str2[LEN];int len = strlen(word[i]);for(int j=0; j<len-1; j++){int k,kk;for(k=0,kk=0; kk<=j; k++,kk++) str1[k] = word[i][kk];str1[k] = '\0';for(k=0,kk=j+1; kk<len; k++,kk++) str2[k] = word[i][kk];str2[k] = '\0';int ok[2];ok[0] = find(str1);ok[1] = find(str2);if(ok[0] != -1 && ok[1] != -1){printf("%s\n",word[i]);break;}}}return 0;
}

uva 10391 Compound Words相关推荐

  1. UVa 10391 Compound Words(复合词)

    题意  输出所有输入单词中可以由另两个单词的组成的词 STL set的应用  枚举每个单词的所有可能拆分情况  看拆开的两个单词是否都存在  都存在的就可以输出了 #include <bits/ ...

  2. UVA 10391 - Compound Words

    链结:戳我. TLE...看来是Hash Table做的不够好. View Code 1 /* 2 Author: frankdj 3 State: TLE 4 */ 5 #include <i ...

  3. Compound Words UVA - 10391(c++用法中substr函数用法+map实现)

    题意: 给出字典中一堆单词,单词的输入方式是以字典序输入的.问:在这一堆单词中,有那些单词是通过其它两个单词组合而来的.按字典序升序输出这些单词. 题目: You are to find all th ...

  4. 15行代码AC——习题5-5 复合词(Compound Words, UVa 10391)——解题报告

    励志用少的代码做高效的表达 题目(提交)链接→UVA-10391 本题实质是#include<string>头文件的substr()字符串分割函数与#include<algorith ...

  5. 复合词(Compound Words, UVa 10391)

    给出一个词典,找出所有的复合词,即恰好有两个单词连接而成的单词.输入每行都是 一个由小写字母组成的单词.输入已按照字典序从小到大排序,且不超过120000个单词.输 出所有复合词,按照字典序从小到大排 ...

  6. UVA 10391 STL容器的使用

    这道题目,我是用了2个set(s1,s2)容器,s1用来盛放所有的字符串,然后遍历s1,把每个字符串拆成2部分,再判断s1里是否均含有这2部分,如果有就加入到s2容器里,因为它要求按照字典序输出,se ...

  7. 紫书《算法竞赛入门经典》

    紫书<算法竞赛入门经典>题目一览 第3章 数组和字符串(例题) UVA 272 TEX Quotes UVA 10082 WERTYU UVA 401 Palindromes UVA 34 ...

  8. python redis 性能测试台_Redis性能测试

    Redis 性能测试 Redis 性能测试是通过同时执行多个命令实现的.Redis性能测试主要是通过src文件夹下的redis-benchmark来实现(Linux系统下) 语法 redis 性能测试 ...

  9. 算法竞赛入门经典(第2版)—第五章(C++与STL入门)

    文章目录 零碎知识点整理 题目 10474 - Where is the Marble? 101 - The Blocks Problem 10815 - Andy's First Dictionar ...

最新文章

  1. 碰撞检测碰撞Java简单游戏开发之碰撞检测
  2. 两代“狗”开发者首次解答30多个问题,一定有你想了解的!(附论文下载)
  3. iPhone开发中现文件的增加 删除和查询
  4. Nginx访问控制_IP访问控制(http_access_module)原理、局限性、解决方法讲解
  5. Sub-process /usr/bin/dpkg returned an error code (1) 如何解决
  6. nyist --- 组队赛(四)
  7. 多个服务间多个自定义的ExceptionHandler类的执行顺序
  8. 【BZOJ2565】最长双回文串(回文树)
  9. mysql时间总结_MYSQL日期时间总结
  10. 《指针的编程艺术(第二版)》一2.3 三颗星星:表示三把钥匙
  11. 济安横断面为什么会有水印_PS差值模式是如何去水印的?你看的懂抖音的沙雕做法?...
  12. Transformer-XL、Vanilla Transformer
  13. FAT32文件系统FAT表修复
  14. Java里线程的隔离方式_线程隔离浅析
  15. 我所知道的金融数据库
  16. 孙溟㠭书画艺术《退步向前》
  17. Node.js Cannot find module 'xxx' 问题解决
  18. 2018省赛第九届蓝桥杯真题C语言B组第十题题解 乘积最大
  19. 一次当晋级评委的经历
  20. c语言课程设计——影院管理系统

热门文章

  1. 机器视觉 · 工业镜头
  2. 【杂谈】有三AI专业版学习扑克牌上线,一副扑克,看懂AI核心技术
  3. 全球及中国甲基丙烯酸烷基酯行业深度研究与未来投资潜力分析报告2022版
  4. android+studio+选择+苹方字体,启动欢迎页面时,Android Studio设置全屏Activity
  5. Hadoop实例之利用MapReduce实现日志清洗(附源代码)
  6. 使用wrk进行性能测试
  7. 2016级算法第一次练习赛-E.AlvinZH的儿时回忆——蛙声一片
  8. codevs1520 回文字符串
  9. 推荐一款非常好用的java反编译工具(转)
  10. delphi编译缺少组件 imgedit excel2000等