博客
关于我
YbtOJ hash和hash表课堂过关 例4 单词背诵【hash】【二分】
阅读量:337 次
发布时间:2019-03-04

本文共 1575 字,大约阅读时间需要 5 分钟。

在这里插入图片描述

思路

首先把需要背诵的单词存入 h a s h hash hash 表。
然后我们要把单词表里的单词先扫一遍,统计出最坏长度的答案。
然后用尺取法,不断向右移动 r r r, 当当前长度已经可以得到最坏长度的答案,就更行长度,然后把l向右移到一个单词出列(遇到相同单词继续移)。
注意:单词表中的单词可能不需要背诵!

代码

#include<algorithm>#include<iostream>#include<cstdio>using namespace std;int wz[100010],t[100010],t2[100010];unsigned long long js;string s[100010];int n,m,ans,ansjl;struct node{   	unsigned long long hash1,hash2;	long long bj; }a[100010];bool cmp(const node&df,const node&df2){   	return df.hash1<df2.hash1;}int main(){       cin>>n;    for(int i=1; i<=n; i++)     {        	cin>>s[i];     	a[i].bj=i;     	int lon=s[i].size();     	for(int j=0; j<=lon-1; j++)     	   a[i].hash1=a[i].hash1*131ull+(s[i][j]-43);	 }	sort(a+1,a+1+n,cmp);	cin>>m;	for(int i=1; i<=m; i++)	 {   	 	cin>>s[i];	 	int lon=s[i].size();	 	wz[i]=-1,js=0;   //初始化-1,如果出现主义中的状况就可直接判断	 	for(int j=0; j<=lon-1; j++)	 	   js=js*131ull+(s[i][j]-43);	 	int l=1,r=n,mid=0;	 	while(l<=r)	 	 {   	 	 	mid=(l+r)>>1; 	 	 	if(js<a[mid].hash1)	 	 	  r=mid-1;	 	 	else if(js>a[mid].hash1)	 	 	  l=mid+1;	 	 	else	 	 	 {   	 	 	 	wz[i]=a[mid].bj;	 	 	 	break;			 }		 }		if(t[wz[i]]==0&&!(wz[i]==-1))		 {   		 	t[wz[i]]=1;		 	ans++;		 }	 }	cout<<ans;	ansjl=m;	int l=1,ans2=0;	for(int r=1; r<=m; r++)	 {   	 	if(wz[r]!=-1)	 	 {   	 	 	if(t2[wz[r]]==0)	 	 	  ans2++;	 	 	t2[wz[r]]++;	 	    if(wz[l]!=-1)	 	     {   	 	       while(l<=r&&ans2==ans)	 	        {   	 	        	t2[wz[l]]--;	 	        	if(t2[wz[l]]==0)	 	        	 {   	 	        	 	ansjl=min(ansjl,r-l+1);	 	        	 	ans2--;					 }					l++;		        }			 }			 }	 }	cout<<endl<<ansjl;	return 0;}

转载地址:http://yole.baihongyu.com/

你可能感兴趣的文章
Redis踩坑(1)-----配置文件redis.conf修改后不生效问题
查看>>
从零带你学习Go语言:23、 Go指针 、切片、 map、 结构体复习
查看>>
广东iOS企业开发者签名有没有好的推荐?
查看>>
iOS企业签名掉签会提前知道的么?
查看>>
苹果企业签名首要考虑的真的是价格因素么?别傻了
查看>>
关于scanf函数在VS中使用的问题
查看>>
操作符初识
查看>>
c编程常见错误-函数声明没有参数类型声明
查看>>
Dialog篇
查看>>
概率论 贝叶斯公式
查看>>
数据挖掘 如何做 Python数据分析与挖掘实战
查看>>
java 重写(override)和重载(overload)区别
查看>>
java 多态
查看>>
java 多态类型转换
查看>>
java ==和equals
查看>>
java 接口(Interface)多态特性
查看>>
搜集整理随机产生人的姓名的2种方法
查看>>
最简单的Socket程序[入门篇]
查看>>
VS2005图标默认存放位置
查看>>
常用正则表达式
查看>>