[CODEVS3031] 单词背诵 - 字符串hash

3013 单词背诵

时间限制: 1 s

空间限制: 128000 KB

题目等级 : 钻石 Diamond

题目描述 Description

灵梦有n个单词想要背,但她想通过一篇文章中的一段来记住这些单词。

文章由m个单词构成,她想在文章中找出连续的一段,其中包含最多的她想要背的单词(重复的只算一个)。并且在背诵的单词量尽量多的情况下,还要使选出的文章段落尽量短,这样她就可以用尽量短的时间学习尽可能多的单词了。

输入描述 Input Description

第1行一个数n,

接下来n行每行是一个长度不超过10的字符串,表示一个要背的单词。

接着是一个数m,

然后是m行长度不超过10的字符串,每个表示文章中的一个单词。

输出描述 Output Description

输出文件共2行。第1行为文章中最多包含的要背的单词数,第2行表示在文章中包含最多要背单词的最短的连续段的长度。

样例输入 Sample Input

3

hot

dog

milk

5

hot

dog

dog

milk

hot

样例输出 Sample Output

3

3

数据范围及提示 Data Size & Hint

对于30%的数据 n<=50,m<=500;

对于60%的数据 n<=300,m<=5000;

对于100%的数据 n<=1000,m<=100000;



题解 :

  把每一个都hash一下然后直接判断第一问解决;

  对于第二问,我们可以贪心地考虑,我们在所选择的区间里有这个字符,那么我们就可以舍弃一个;

  于是我们可以每次移动右端点,然后把所有单词找完之后停止,吧左端点往前缩,即如果这个字符串不止出现一次, 我们就可以舍弃他;

  然后不一定你选择的第一个区间一定是最优的,所以我们要遍历整个区间;

  然后hash取进制数的时候要慎重,我因为这个wa了好几遍;



Code:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <string>
 4 #include <cstring>
 5 #include <map>
 6 using namespace std;
 7 #define base 26
 8 const int mod = 100007;
 9
10 int n;
11 long long a[1010];
12 long long b[100010];
13 bool hash[100010], vis[100010];
14 int num[100010];
15
16 inline int HASH(string x)
17 {
18     int ans = 0;
19     int len = x.length();
20     for (register int i = 0; i < len; i ++)
21     {
22         ans = (ans * base + x[i]) % mod;
23     }
24     return ans;
25 }
26
27 int ans;
28 int minn = 1e9;
29
30 int main()
31 {
32     scanf("%d", &n);
33     for (register int i = 1; i <= n; ++i)
34     {
35         string s;
36         cin >> s;
37         a[i] = HASH(s);
38         hash[a[i]] = 1;
39     }
40
41     int m;cin >> m;
42     for (register int i = 1 ; i <= m ; i ++)
43     {
44         string s;
45         cin >> s;
46         b[i] = HASH(s);
47         if (hash[b[i]] and !vis[b[i]]) ans++, vis[b[i]] = 1;
48     }
49     cout << ans << endl;
50
51     int r = 1, l = 1;
52     int nn = 0;
53     while (r <= m)
54     {
55         while (r <= m)
56         {
57             if (vis[b[r]] and num[b[r]] == 0) nn ++;
58             num[b[r]]++;
59             r++;
60             if (nn == ans) break;
61         }
62         while ((vis[b[l]] == 0 or num[b[l]] >= 2) and l < r) num[b[l]]--, l++;
63         minn = min(r - l, minn);
64     }
65
66     cout << minn;
67     return 0;
68 }

原文地址:https://www.cnblogs.com/zZh-Brim/p/9245481.html

时间: 2024-10-14 17:47:51

[CODEVS3031] 单词背诵 - 字符串hash的相关文章

【luogu P1381单词背诵】题解

单词背诵 题目描述 灵梦有n个单词想要背,但她想通过一篇文章中的一段来记住这些单词. 文章由m个单词构成,她想在文章中找出连续的一段,其中包含最多的她想要背的单词(重复的只算一个).并且在背诵的单词量尽量多的情况下,还要使选出的文章段落尽量短,这样她就可以用尽量短的时间学习尽可能多的单词了. 输入格式 第1行一个数n, 接下来n行每行是一个长度不超过10的字符串,表示一个要背的单词. 接着是一个数m, 然后是m行长度不超过10的字符串,每个表示文章中的一个单词. 输出格式 输出文件共2行.第1行

【二分答案+智障的字符串hash】BZOJ2946-[Poi2000]公共串(Ranklist倒一达成!!!!!)【含hash知识点】

[题目大意] 给出几个由小写字母构成的单词,求它们最长的公共子串的长度. [字符串hash的小笔记] hash[i]=(hash[i-1]*p+idx(s[i]))%mod,idx为映射值,一般a..z映射1..26: 习惯上,p取一个6到8位的素数即可,mod一般取大素数 1e9+7(1000000007)或1e9+9(1000000009). hash[i]=(hash[i-1]*p+idx(s[i]))%mod 表示第 i 个前缀的hash值,是一个hash的前缀和,那么,要求S[l…r]

字符串hash - 简单的字符匹配 --- poj 3461

Oulipo Problem's Link:http://poj.org/problem?id=3461 Mean: 给你一个模式串P和一个母串S,让你统计P串在S串中出现的次数. analyse: 这题我一开始想到的就是使用KMP,就用KMP写了,93ms,挺快的.我又用AC自动机写了一遍(纯属娱乐),万万没想到竟然超时了,是我姿势不对么? 后来看别人有用字符串hash写的,听说字符串hash在某些问题中比AC自动机什么的厉害多了,于是又用字符串hash写了一遍,确实挺不错的,代码30+行,而

HDU 5763 Another Meaning dp+字符串hash

题意:给定一个句子str,和一个单词sub,这个单词sub可以翻译成两种不同的意思,问这个句子一共能翻译成多少种不能的意思 例如:str:hehehe   sub:hehe 那么,有**he.he**.和hehehe三种不同的意思, 考虑一下aaadaaa这种情况?sub:aa  前面的aaa有三种,后面的aaa有三种,所以一共应该是有9种情况. 可以考虑成3*3=9 如果你考虑分块去相乘的话,那么恭喜你,你GG了.因为这样写非常复杂,而且非常难判断. 可以考虑下dp,因为注意到,它每个单词只有

UVA 257 - Palinwords(字符串HASH)

UVA 257 - Palinwords 题目链接 题意:输出一个文本里面的palinword,palinword的定义为,包含两个不同的回文子串,并且要求回文子串不能互相包含 思路:对于每个单词判断一次,由于不能互相包含,对于每个位置,其实就只要找长度3和4的情况即可,这样复杂度为O(n),至于判断重复的,就用hash即可 代码: #include <cstdio> #include <cstring> char str[260]; int hash[555555], save[

转载:字符串hash总结(hash是一门优雅的暴力!)

转载自:远航休息栈 字符串Hash总结 Hash是什么意思呢?某度翻译告诉我们: hash 英[hæ?] 美[hæ?]n. 剁碎的食物; #号; 蔬菜肉丁;vt. 把…弄乱; 切碎; 反复推敲; 搞糟; 我觉得Hash是引申出 把...弄乱 的意思. 今天就来谈谈Hash的一种——字符串hash. 据我的理解,Hash就是一个像函数一样的东西,你放进去一个值,它给你输出来一个值.输出的值就是Hash值.一般Hash值会比原来的值更好储存(更小)或比较. 那字符串Hash就非常好理解了.就是把字符

字符串Hash总结(转载)

转载地址 Hash是什么意思呢?某度翻译告诉我们: hash 英[hæ?] 美[hæ?] n. 剁碎的食物; #号; 蔬菜肉丁; vt. 把…弄乱; 切碎; 反复推敲; 搞糟; 我觉得Hash是引申出 把...弄乱 的意思. 今天就来谈谈Hash的一种——字符串hash. 据我的理解,Hash就是一个像函数一样的东西,你放进去一个值,它给你输出来一个值.输出的值就是Hash值.一般Hash值会比原来的值更好储存(更小)或比较. 那字符串Hash就非常好理解了.就是把字符串转换成一个整数的函数.而

字符串hash与字典树

title: 字符串hash与字典树 date: 2018-08-01 22:05:29 tags: acm 算法 字符串 概述 这篇主要是关于字符串里的 字符串hash 和 字符串字典树,,两个都是简单的套模板的东西,,,理解基本思想就行了,,,对了,,还有一个字典树的的变形--01字典树: 字符串hash 如何求一个字符串的hash值 字符串hash的作用就是将 字符串有效的转化为一个整数 ,,这个转化过程利用的是一个 hash函数 例如,,我们选hash函数为 \(hash[i]=(has

hdu 1880 魔咒词典(字符串hash)

题目链接:hdu 1880 魔咒词典 题意: 给你一个10w的词典,让你输出对应的字段. 题解: map暴力存字符串肯定会卡内存,这里用BKDR字符串hash一下,用map映射一下. 1 #include<bits/stdc++.h> 2 #define F(i,a,b) for(int i=a;i<=b;++i) 3 using namespace std; 4 typedef unsigned long long ull; 5 6 const int N=1e5+7,seed=133