洛谷 - P1381 - 单词背诵 - 哈希 - 尺取
https://www.luogu.org/problemnew/show/P1381
字符串匹配,用哈希总没有错的。
然后就是尺取了,题目要求首先尽可能多覆盖,那么每次尾巴往后面长。
一开始先找到第一个要的词汇。这个不多说。
然后每次往后面长,遇到非法词汇就继续长。
遇到合法的,就把头部所有合法的重复词和非法词都取出来。
注意要特殊处理非法词。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
unordered_set<ull> dic;//要背的单词的词典
unordered_map<ull,int> cnt;//当前区间要背单词的数量
int n,m;
ull get_hash(char *s) {
ull res=0;
for(int i=0; s[i]!='\0'; i++) {
res=res*19260817+s[i];
}
return res;
}
char str[15];
ull a[100005];
int main() {
#ifdef Yinku
freopen("Yinku.in","r",stdin);
#endif // Yinku
scanf("%d",&n);
for(int i=1; i<=n; i++) {
scanf("%s",str);
dic.insert(get_hash(str));
}
scanf("%d",&m);
int cntv=0;
int len=0;
int head=1;//尺取区间的头
int maxcnt=0;
int maxcnt_len=0;
for(int i=1; i<=m; i++) {
scanf("%s",str);
ull ha=get_hash(str);
a[i]=ha;
if(cnt.size()==0) {
//刚刚开始处理,尺取区间里面没有有效单词
if(!dic.count(ha)) {
//这个单词也是无效的,直接把head指向下一个位置
head++;
} else {
//这个单词是有效的,包含进来
cnt[ha]++;
//head固定在这里了,新单词导致cntv上升
cntv++;
//第一个单词使得len也上升了
len++;
if(cntv>=maxcnt) {
if(cntv>maxcnt) {
maxcnt=cntv;
maxcnt_len=len;
} else {
maxcnt_len=min(maxcnt_len,len);
}
}
}
} else {
//尺取区间的单词列表中至少有一个
if(!dic.count(ha)) {
//就算没用但是可能会把后面连起来,记上
len++;
} else {
//这个词是有用的
if(!cnt.count(ha)) {
//这个词没见过
cntv++;
}
cnt[ha]++;
len++;
while(!dic.count(a[head])||cnt[a[head]]>=2) {
//头部是非法词汇,或者头部是合法词汇,且至少重复了1次,把头部取出
if(dic.count(a[head]))
cnt[a[head]]--;
head++;
len--;
}
//现在头部必定是不重复的合法词汇,且至少有1个
if(cntv>=maxcnt) {
if(cntv>maxcnt) {
maxcnt=cntv;
maxcnt_len=len;
} else {
maxcnt_len=min(maxcnt_len,len);
}
}
}
}
}
printf("%d\n%d\n",maxcnt,maxcnt_len);
return 0;
}
洛谷 - P1381 - 单词背诵 - 哈希 - 尺取的更多相关文章
- 洛谷 P1381 单词背诵
洛谷 P1381 单词背诵 洛谷传送门 题目描述 灵梦有n个单词想要背,但她想通过一篇文章中的一段来记住这些单词. 文章由m个单词构成,她想在文章中找出连续的一段,其中包含最多的她想要背的单词(重复的 ...
- 洛谷 P1381 单词背诵 解题报告
P1381 单词背诵 题目描述 灵梦有\(n\)个单词想要背,但她想通过一篇文章中的一段来记住这些单词. 文章由\(m\)个单词构成,她想在文章中找出连续的一段,其中包含最多的她想要背的单词(重复的只 ...
- 洛谷 P1101 单词方阵
题目链接 https://www.luogu.org/problemnew/show/P1101 题目描述 给一n×n的字母方阵,内可能蕴含多个"yizhong"单词.单词在方阵中 ...
- 洛谷P1808 单词分类_NOI导刊2011提高(01) 字符串排序
洛谷P1808 单词分类_NOI导刊2011提高(01) 题目描述 Oliver为了学好英语决定苦背单词,但很快他发现要直接记住杂乱无章的单词非常困难,他决定对单词进行分类. 两个单词可以分为一类当且 ...
- 洛谷 P1226 【模板】快速幂||取余运算
题目链接 https://www.luogu.org/problemnew/show/P1226 题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 ...
- 洛谷 P1019 单词接龙 (DFS)
题目传送门 当时一看到这题,蒟蒻的我还以为是DP,结果发现标签是搜索-- 这道题的难点在于思路和预处理,真正的搜索实现起来并不难.我们可以用一个贪心的思路,开一个dic数组记录每个单词的最小重复部分, ...
- 洛谷——P1101 单词方阵
https://www.luogu.org/problem/show?pid=1101#sub 题目描述 给一nXn的字母方阵,内可能蕴含多个“yizhong”单词.单词在方阵中是沿着同一方向连续摆放 ...
- 洛谷P1101 单词方阵——S.B.S.
题目描述 给一nXn的字母方阵,内可能蕴含多个“yizhong”单词.单词在方阵中是沿着同一方向连续摆放的.摆放可沿着8个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间[color=red ...
- 洛谷P1808 单词分类
题目描述 Oliver为了学好英语决定苦背单词,但很快他发现要直接记住杂乱无章的单词非常困难,他决定对单词进行分类. 两个单词可以分为一类当且仅当组成这两个单词的各个字母的数量均相等. 例如“AABA ...
随机推荐
- C# 比较两个数组中的内容是否相同的算法
这里要比较的是两个数组中的内容是否相同,以int数组为例 int[] Arraya=new[] {1,2,3,4,5} int[] Arrayb=new[] {5,3,2,1,4} 以上两个数组内的值 ...
- linux 块设备驱动 (三)块设备驱动开发
一: 块设备驱动注册与注销 块设备驱动中的第1个工作通常是注册它们自己到内核,完成这个任务的函数是 register_blkdev(),其原型为:int register_blkdev(unsigne ...
- PHP 5.6编译安装
yum install openssl openssl-devel libxml2-devel libxml2 bzip2 bzip2-devel curl-devel php-mcrypt libm ...
- 一致性Hash简单介绍和使用
背景: 一致性Hash用于分布式缓存系统,将Key值映射到详细机器Ip上,而且添加和删除1台机器的数据移动量较小,对现网影响较小 实现: 1 Hash环:将节点的Hash值映射到一个Hash环中.每一 ...
- ASP.NET车辆管理系统100%源代码
系统开发环境为VS2010.採用ASP.NET框架.数据库採用SQL Server.系统採用Ajax,具有:GPS导航(实时监控报警).申请审核.流程查看及短信息发送等功能.这个系统界面和功能是我认为 ...
- 升级到Scriptcase 8.0的注意事项
Scriptcase的最新版本号v8.0已经正式公布了,因为国外下载较慢,我们在百度云盘创建了下载地址: http://pan.baidu.com/s/1qWwh6bi (Windows可运行文件)大 ...
- OpenStack部署到Hadoop的四种方案
随着企业開始同一时候利用云计算和大数据技术.如今应当考虑怎样将这些工具结合使用.在这样的情况下,企业将实现最佳的分析处理能力.同一时候利用私有云的高速弹性 (rapid elasticity) 和单一 ...
- MySQL 创建自定义函数(1)
1. 创建测试自定义函数(1) CREATE DEFINER=`dbdh`@`localhost` FUNCTION `test`.`sp_function_dbdh_three`() RETURNS ...
- 九度OJ 1113:二叉树 (完全二叉树)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5079 解决:1499 题目描述: 如上所示,由正整数1,2,3--组成了一颗特殊二叉树.我们已知这个二叉树的最后一个结点是n.现在的问题是 ...
- appium(5)-Appium capabilities
Appium Capabilities Appium server capabilities Capability Description Values automationName Which au ...