POJ 3320 Jessica‘s Reading Problem(哈希、尺取法)

摘要:
http://poj.org/problem?id=3320给出一串数字,并要求所有数字的最短长度。想法:哈希不是很有用。这个问题也涉及到其他人的代码,并且已经思考了很长时间。1#包括<iostream>2#包括<算法>3#包括<字符串>4#包括<cstring>5使用命名空间

http://poj.org/problem?id=3320

题意:
给出一串数字,要求包含所有数字的最短长度。

思路:

哈希一直不是很会用,这道题也是参考了别人的代码,想了很久。

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<string>
 4 #include<cstring>
 5 using namespace std;
 6 
 7 const int PRIME = 99999;
 8 
 9 int n;
10 int len;
11 
12 //开散列法,也就是用链表来存储,所以下面的len是从PRIME开始的,因为前面的都是头结点。
13 
14 struct node       //key是数值大小,num是该key出现的次数,因为是链表存储,所以next指向下一个结点
15 {
16     int key;
17     int num;
18     int next;
19 }p[1000005];
20 
21 int a[1000005];
22 
23 int _hash(int num)
24 {
25     int k = num%PRIME;     //取余
26     while (p[k].next != -1)    //该数值已经出现过了
27     {
28         if (num > p[p[k].next].key)  break;      //按递减的方式排列
29         else if (num == p[p[k].next].key)  return p[k].next;   //如果已经出现过了,直接返回
30         k = p[k].next;
31     }
32     //没有出现过,添加新的结点
33     p[len].key = num;
34     p[len].num = 0;
35     p[len].next = p[k].next;
36     p[k].next = len;
37     len++;
38     return len - 1;
39 }
40 
41 int main()
42 {
43     //freopen("D:\txt.txt", "r", stdin);
44     while (~scanf("%d", &n) && n)
45     {
46         for (int i = 0; i < PRIME; i++)
47             p[i].next = -1;
48         len = PRIME;
49         int left = 0;
50         int ans;
51         for (int i = 0; i < n; i++)
52         {
53             scanf("%d", &a[i]);
54             int temp = _hash(a[i]);
55             p[temp].num++;
56             if (p[temp].num == 1)   //说明第一次出现,所以肯定要包括进去,此时ans肯定等于i-left+1
57             {
58                 ans = i - left + 1;
59                 continue;
60             }
61             //如果之前已经出现过
62             temp = _hash(a[left]);
63             //如果left指向的数值后面还有出现,那么可以右移一位
64             while (left<n - 1 && p[temp].num>1)
65             {
66                 p[temp].num--;
67                 left++;
68                 temp = _hash(a[left]);
69             }
70             if (ans > i - left + 1)      ans = i - left + 1;
71         }
72         printf("%d
", ans);
73     }
74     return 0;
75 }

接下来再附上尺取法的做法,主要思路和上面是差不多的。

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<string>
 4 #include<cstring>
 5 #include<set>
 6 #include<map>
 7 using namespace std;
 8 
 9 const int maxn = 1000000 + 5;
10 
11 int n;
12 int x[maxn];
13 set<int> p;
14 map<int, int> q;
15 
16 int main()
17 {
18     //freopen("D:\txt.txt", "r", stdin);
19     while (~scanf("%d", &n))
20     {
21         p.clear();
22         q.clear();
23         for (int i = 1; i <= n; i++)
24         {
25             scanf("%d", &x[i]);
26         }
27 
28         for (int i = 1; i <= n; i++)
29             p.insert(x[i]);
30 
31         int ans = n;
32         int total = p.size();    //不重复的数
33         int sum = 0;
34         int left = 1, right = 1;
35         while (left<=n && right <= n)
36         {
37             if (q[x[right]] == 0)  sum++; //这个数没有出现过
38             q[x[right]]++;
39             
40             while (q[x[left]] > 1)
41             {
42                 q[x[left]]--;
43                 left++;
44             }
45             if (sum == total)
46             {
47                 ans = min(ans, right - left + 1);
48                 if (q[x[left]] == 1)  sum--;
49                 q[x[left]]--;
50                 left++;
51             }
52             right++;
53         }
54         printf("%d
", ans);
55     }
56     return 0;
57 }

免责声明:文章转载自《POJ 3320 Jessica‘s Reading Problem(哈希、尺取法)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Apache Solr 全版本任意读取文件漏洞JAX-WS HandlerChain使用详解下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

HDOJ 1166 敌兵布阵树状数组 线段树

敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 18120Accepted Submission(s): 7877 Problem Description C国的死对头A国这段时间正在进行军事演习...

oracle系列学习----复杂查询的优化

实验数据和表 create table test1 ( FID NUMBER(6) NOT NULL, FBillNo VARCHAR2(10), FDate DATE DEFAULT to_date(to_char(SYSDATE,'yyyy-mm-dd'),'yyyy-mm-dd') ) create sequence...

一个可以选择目录生成doc目录内容的小工具(三) -python-docx

回到一说到docx的用法,度娘一大堆参考文档,眼花缭乱的。这里就不啰嗦了,基本上就是新建个Document对象,然后往上边加标题、段落、表格。附带设置这些对象的字型字号啥的。不过有一点,docx和python-docx是两个库,看帖的时候要小心。建议看官方文档 接着看看我们的目标: 为了实现这种编号,我先是想修改本地docx的样式来解决,生成文档的时候只设...

频域特征-Fbank

Fbank是一种前端处理方法,以类似人耳的方式对音频进行处理,可以提高语音识别的性能。fbank的计算流程与语谱图类似,唯一的区别就在于加了个Mel滤波器,从而使得得到的特征更逼近人耳特性。有关于Mel滤波器的相关内容可以查阅https://mp.weixin.qq.com/s/pGwO_27x8ddQF55wTSQlmA。接下来就介绍一下fbank的求取...

redis产生随机数据

  由于需要研究redis cluster集群监控,需要产生随机数据,顾写此set和list随机数据生成代码。 直接贴代码 # coding: utf-8 # author Elephanyu from abc import abstractmethod from random import randint, choice from redisclust...

C# LINQ学习笔记一:走进LINQ的世界

本笔记摘抄自:https://www.cnblogs.com/liqingwen/p/5832322.html,记录一下学习过程以备后续查用。 LINQ 简介: 语言集成查询(LINQ)是Visual Studio 2008和.NET Framework 3.5版中引入的一项创新功能。 传统上,针对数据的查询都是以简单的字符串表示,而没有编译时类型检查或I...