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 - 单词背诵 - 哈希 - 尺取的更多相关文章

  1. 洛谷 P1381 单词背诵

    洛谷 P1381 单词背诵 洛谷传送门 题目描述 灵梦有n个单词想要背,但她想通过一篇文章中的一段来记住这些单词. 文章由m个单词构成,她想在文章中找出连续的一段,其中包含最多的她想要背的单词(重复的 ...

  2. 洛谷 P1381 单词背诵 解题报告

    P1381 单词背诵 题目描述 灵梦有\(n\)个单词想要背,但她想通过一篇文章中的一段来记住这些单词. 文章由\(m\)个单词构成,她想在文章中找出连续的一段,其中包含最多的她想要背的单词(重复的只 ...

  3. 洛谷 P1101 单词方阵

    题目链接 https://www.luogu.org/problemnew/show/P1101 题目描述 给一n×n的字母方阵,内可能蕴含多个"yizhong"单词.单词在方阵中 ...

  4. 洛谷P1808 单词分类_NOI导刊2011提高(01) 字符串排序

    洛谷P1808 单词分类_NOI导刊2011提高(01) 题目描述 Oliver为了学好英语决定苦背单词,但很快他发现要直接记住杂乱无章的单词非常困难,他决定对单词进行分类. 两个单词可以分为一类当且 ...

  5. 洛谷 P1226 【模板】快速幂||取余运算

    题目链接 https://www.luogu.org/problemnew/show/P1226 题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 ...

  6. 洛谷 P1019 单词接龙 (DFS)

    题目传送门 当时一看到这题,蒟蒻的我还以为是DP,结果发现标签是搜索-- 这道题的难点在于思路和预处理,真正的搜索实现起来并不难.我们可以用一个贪心的思路,开一个dic数组记录每个单词的最小重复部分, ...

  7. 洛谷——P1101 单词方阵

    https://www.luogu.org/problem/show?pid=1101#sub 题目描述 给一nXn的字母方阵,内可能蕴含多个“yizhong”单词.单词在方阵中是沿着同一方向连续摆放 ...

  8. 洛谷P1101 单词方阵——S.B.S.

    题目描述 给一nXn的字母方阵,内可能蕴含多个“yizhong”单词.单词在方阵中是沿着同一方向连续摆放的.摆放可沿着8个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间[color=red ...

  9. 洛谷P1808 单词分类

    题目描述 Oliver为了学好英语决定苦背单词,但很快他发现要直接记住杂乱无章的单词非常困难,他决定对单词进行分类. 两个单词可以分为一类当且仅当组成这两个单词的各个字母的数量均相等. 例如“AABA ...

随机推荐

  1. mysql 中遇到金额 BigDecimal类型字段

    当数据库字段为BigDecimal型,and后面判断去掉. 否则当为0时候,视为空处理了.即传参为null

  2. JAR、WAR、EAR(转载)

    转自:http://blog.csdn.net/mashengwang/article/details/6105189 区别:Jar.war.EAR.在文件结构上,三者并没有什么不同,它们都采用zip ...

  3. 模式识别之ocr项目---(模板匹配&BP神经网络训练)

    摘 要 在MATLAB环境下利用USB摄像头采集字符图像,读取一帧保存为图像,然后对读取保存的字符图像,灰度化,二值化,在此基础上做倾斜矫正,对矫正的图像进行滤波平滑处理,然后对字符区域进行提取分割出 ...

  4. java object monitor

    1 什么是java object monitor 每个java对象头中都有锁状态位标记.java中在使用synchronize同步的时候,肯定是涉及到某个对象的锁.因此,在考虑同步的时候,首先要想到是 ...

  5. Eclipse中连接Sql Sever2008 -----转自Yogurshine

    Eclipse中连接Sql Sever2008 -----转自Yogurshine 一 SQl Sever服务器配置 1我之前已经安装好SQL Sever 2008R2.(注意:安装一遍未成功时,一定 ...

  6. volley get post json imagerequest imageloader networkimageview 加载网络本地图片

    官方网站  https://www.androidhive.info/2014/05/android-working-with-volley-library-1/ private void initL ...

  7. Dubbo与Zookeeper、SpringMVC整合与使用(干货-理论放一遍。。。还未完结!)

    Dubbo跟Zookeeper的简介分享两个不错的链接: Dubbo简介:http://shiyanjun.cn/archives/325.html Zookeeper简介:http://www.op ...

  8. finalize方法

    什么是垃圾回收机制 不定时去堆内存中清理不可达对象.不可达的对象并不会马上就会直接回收, 垃圾收集器在一个Java程序中的执行是自动的,不能强制执行,即使程序员能明确地判断出有一块内存已经无用了,是应 ...

  9. 未知USB设备 端口重置失败

    1.开启手机中USB调试 进入“设置”->“应用程序”->“开发”勾选“USB调试程序”.这样设备才可以通过USB连线时被PC识别到. 2.安装驱动 要将Android手机连接到PC需要安 ...

  10. linux安装flume及问题

    验证是否安装成功: [root@master conf]# /usr/local/src/apache-flume-1.6.0-bin/bin/flume-ng versionError: Could ...