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. iOS开发 - UIViewController控制器管理

    创建一个控制器 控制器常见的创建方式有下面几种 //通过storyboard创建 //直接创建 ViewController *vc = [[ViewController alloc] init]; ...

  2. git和github菜鸟使用步骤

    刚刚在windows7下安装完git.奉上安装步骤. git安装 安装git程序.运行以下操作: 1. $ cd ~/.ssh    //检查计算机ssh密钥 2.假设没有提示:No such fil ...

  3. WPF学习专题

    http://developer.51cto.com/art/200809/88207.htm

  4. etymology-I

    1)inter-.intra-.intro- 三个前缀inter-,intra-和intro-还是有差别的. inter-表between,如international那是between differ ...

  5. Unable to run Kiwi tests on iOS8 device

    本文转载至 http://stackoverflow.com/questions/25871601/unable-to-run-kiwi-tests-on-ios8-device 5down vote ...

  6. go map 线程不安全 安全措施

    go map   线程不安全  安全措施

  7. Android 监听返回键退出程序的两种实现

    1.Android 双击返回键退出程序 思路:用户按下返回键时设定一个定时器来监控是否2秒内实现了退出,如果用户没有接着按返回键,则清除第一次按返回键的效果,使程序还原到第一次按下返回键之前的状态.定 ...

  8. 如何解决Apache无法启动的问题

    今天重装xampp后,一直无法启动Apache,提示以下错误: 22:36:54 [Apache] Attempting to start Apache app...22:36:54 [Apache] ...

  9. Java HotSpot(TM) 64-Bit Server VM warning: Insufficient space for shared memory file...

    Java HotSpot(TM) 64-Bit Server VM warning: Insufficient space for shared memory file: 把tomcat中的日志删除, ...

  10. javascript Date对象的介绍及linux时间戳如何在javascript中转化成标准时间格式

    1.Date对象介绍 Date对象具有多种构造函数.new Date()new Date(milliseconds)new Date(datestring)new Date(year, month)n ...