首页 > uva 10391 Compound Words

uva 10391 Compound Words

哈希

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

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

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

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

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

 

BKDHash,40ms

#include 
#include 
#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)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){char str1[LEN] , str2[LEN];int len = strlen(word[i]);for(int j=0; j1; j++){int k,kk;for(k=0,kk=0; kk<=j; k++,kk++)str1[k] = word[i][kk];str1[k] = '';for(k=0,kk=j+1; kk)str2[k] = word[i][kk];str2[k] = '';int ok[2];ok[0] = find(str1);ok[1] = find(str2);if(ok[0] != -1 && ok[1] != -1){printf("%s
",word[i]);break;}}}return 0;
}

 

 

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

#include 
#include 
#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)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)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){char str1[LEN] , str2[LEN];int len = strlen(word[i]);for(int j=0; j1; j++){int k,kk;for(k=0,kk=0; kk<=j; k++,kk++) str1[k] = word[i][kk];str1[k] = '';for(k=0,kk=j+1; kk word[i][kk];str2[k] = '';int ok[2];ok[0] = find(str1);ok[1] = find(str2);if(ok[0] != -1 && ok[1] != -1){printf("%s
",word[i]);break;}}}return 0;
}

 

更多相关:

  •         Apache POI是一个开源的利用Java读写Excel,WORD等微软OLE2组件文档的项目。        我的需求是对Excel的数据进行导入或将数据以Excel的形式导出。先上简单的测试代码:package com.xing.studyTest.poi;import java.io.FileInputSt...

  • 要取得[a,b)的随机整数,使用(rand() % (b-a))+ a; 要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a; 要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1; 通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。 要取得a到b之间的...

  • 利用本征图像分解(Intrinsic Image Decomposition)算法,将图像分解为shading(illumination) image 和 reflectance(albedo) image,计算图像的reflectance image。 Reflectance Image 是指在变化的光照条件下能够维持不变的图像部分...

  • 题目:面试题39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 限制: 1 <= 数组长度 <= 50000 解题: cl...

  • 题目:二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树:      5     /    2   6   /  1   3示例 1: 输入: [1,6,3,2,5] 输出...

  • pip install pywin32from win32com.client import gencachefrom win32com.client import constants, gencachedef doctupdf(wordPath, pdfPath):"""word转pdf:param wordPath: word文件...

  • important_dic = {'预付卡'}weight = 3 #可以修改,也可以再字典里添加权值k=0for word in set(sent): if word in important_dic: k = weight else: k = 0 if wor...

  • 编译环境Eigen3+CUDA9.2+VS2015 错误如下: 解决方式: 将Eigen中的JacobiSVD and BDCSVD里的Index用Eigen::Index替换 http://eigen.tuxfamily.org/dox-devel/TopicCUDA.html http://eigen.tuxfami...

  • 一个数组存储了非负整型数据,数组中的第i个元素a[i],代表了可以从数组第i个 位置最多向前跳跃a[i]步;已知数组各元素的情况下,求是否可以从数组的第0个位置跳跃到数组的最后一个元素的位置,返回是true或者false判断是否能够跳跃到结尾 例如: nums = [2, 3, 1, 1, 4] ,可以从nums[0] = 2 跳跃...

  • d定义: pandas是一个强大的Python数据分析的工具包。 pandas是基于NumPy构建的。 安装方法: pip install pandas import pandas as pd pandas的主要功能 具备对其功能的数据结构DataFrame、Series 集成时间序列功能 提供丰富的数学运算和操作 灵活处理缺失数据...

  •   using System; using System.Text; using System.Security.Cryptography; using System.Web; using System.IO;namespace Thinhunan.Cnblogs.Com.RSAUtility {public class PemCo...

  • 错误信息:ORA-01502: index 'VOX_ID' or partition of such index is in unusable state 原因:将表的表空间做了更改,导致索引失效。表移动表空间,需要重建索引。 解决方法:alter index vox_id rebuild   问题查找: SQL> select i...