洛谷 P1381 单词背诵 解题报告
P1381 单词背诵
题目描述
灵梦有\(n\)个单词想要背,但她想通过一篇文章中的一段来记住这些单词。
文章由\(m\)个单词构成,她想在文章中找出连续的一段,其中包含最多的她想要背的单词(重复的只算一个)。并且在背诵的单词量尽量多的情况下,还要使选出的文章段落尽量短,这样她就可以用尽量短的时间学习尽可能多的单词了。
输入输出格式
输入格式:
第1行一个数\(n\),
接下来\(n\)行每行是一个长度不超过10的字符串,表示一个要背的单词。
接着是一个数\(m\),
然后是\(m\)行长度不超过10的字符串,每个表示文章中的一个单词。
输出格式:
输出文件共2行。第1行为文章中最多包含的要背的单词数,第2行表示在文章中包含最多要背单词的最短的连续段的长度。
首先看懂题,要先把出现的所有单词都背了才能再找最小连续。
所以第一目的是先做匹配找到有多少单词出现了。
有\(hash\),\(map\)几种方法。不过我比较毒瘤,写了字典树匹配。
存下\(f[i]\)数组表示文章第\(i\)个单词是字典中的第几个单词。
第二步就是我也说不清楚的一个思想了,可能有单调队列的影子。
我们先固定左端点l,扫描右端点直到包含所有出现的单词至少一次。
用桶存下每个单词出现次数,然后边移动右端点边尝试移动左端点(如果加入右端点后出现次数大于1即可移动左端点)
我犯的智障错误:
- 字典树居然减了'0',真是绝了。。。
- 统计时不小心把0给统计了。。。
code:
#include <cstdio>
#include <cstring>
int min(int x,int y) {return x<y?x:y;}
const int N=1010;
const int M=100010;
const int inf=0x3f3f3f3f;
struct node
{
int son[26],cnt;
}t[N*10];
char word[12];
int cnt=0,n,m,f[M];
void build(int j)
{
scanf("%s",word);
int now=0,len=strlen(word);
for(int i=0;i<len;i++)
{
int k=word[i]-'a';
if(t[now].son[k])
now=t[now].son[k];
else
{
t[now].son[k]=++cnt;
now=cnt;
}
}
t[now].cnt=j;
}
void check(int j)
{
scanf("%s",word);
int len=strlen(word),now=0;
for(int i=0;i<len;i++)
{
int k=word[i]-'a';
if(t[now].son[k])
now=t[now].son[k];
else
return;
}
f[j]=t[now].cnt;
}
int cnt0[N],used[N],l,a,b=inf,a0=0;//要背长度,最短连续段长度
void DP()
{
used[0]=1;
for(int i=1;i<=m;i++)
{
if(!used[f[i]])
{
a0++;
used[f[i]]=1;
}
}
printf("%d\n",a0);
if(a0==0) {printf("0\n");return;}
l=1;
memset(used,0,sizeof(used));
used[0]=1;
for(int i=1;i<=m;i++)
{
cnt0[f[i]]++;
while(cnt0[f[l]]>1)
{
cnt0[f[l]]--;
l++;
}
if(!used[f[i]])
{
a++;
used[f[i]]=1;
}
if(a==a0)
b=min(i+1-l,b);
}
printf("%d\n",b);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
build(i);
scanf("%d",&m);
for(int i=1;i<=m;i++)
check(i);
DP();
return 0;
}
2018.6.3
洛谷 P1381 单词背诵 解题报告的更多相关文章
- 洛谷 P1381 单词背诵
洛谷 P1381 单词背诵 洛谷传送门 题目描述 灵梦有n个单词想要背,但她想通过一篇文章中的一段来记住这些单词. 文章由m个单词构成,她想在文章中找出连续的一段,其中包含最多的她想要背的单词(重复的 ...
- 洛谷 - P1381 - 单词背诵 - 哈希 - 尺取
https://www.luogu.org/problemnew/show/P1381 字符串匹配,用哈希总没有错的. 然后就是尺取了,题目要求首先尽可能多覆盖,那么每次尾巴往后面长. 一开始先找到第 ...
- 洛谷 P1783 海滩防御 解题报告
P1783 海滩防御 题目描述 WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和仓库总是被敌方派人偷袭 ...
- 洛谷 P4597 序列sequence 解题报告
P4597 序列sequence 题目背景 原题\(\tt{cf13c}\)数据加强版 题目描述 给定一个序列,每次操作可以把某个数\(+1\)或\(-1\).要求把序列变成非降数列.而且要求修改后的 ...
- 洛谷1087 FBI树 解题报告
洛谷1087 FBI树 本题地址:http://www.luogu.org/problem/show?pid=1087 题目描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全 ...
- 洛谷 P4175 [CTSC2008]网络管理 解题报告
P4175 [CTSC2008]网络管理 题目描述 带修改树上链的第\(k\)大 输入输出格式 输入格式: 第一行为两个整数\(N\)和\(Q\),分别表示路由器总数和询问的总数. 第二行有\(N\) ...
- 洛谷 P2444 [POI2000]病毒 解题报告
P2444 [POI2000]病毒 题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已 ...
- 洛谷 P3349 [ZJOI2016]小星星 解题报告
P3349 [ZJOI2016]小星星 题目描述 小\(Y\)是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有\(n\)颗小星星,用\(m\)条彩色的细线串了起来,每条细线连着两颗小星星. 有一 ...
- 洛谷 P3177 树上染色 解题报告
P3177 [HAOI2015]树上染色 题目描述 有一棵点数为\(N\)的树,树边有边权.给你一个在\(0\) ~ \(N\)之内的正整数\(K\),你要在这棵树中选择\(K\)个点,将其染成黑色, ...
随机推荐
- 2018 Multi-University Training Contest 1 部分简单题解析
Preface ACM系列赛第一站,没有进前200还是很伤的. 主要是T2当时没写出来就GG了,后来看了下其实不是很难. 题目按照比赛时我们A的顺序讲,其实我都是被陈潇然大佬和ZWC带飞的. T1 M ...
- 【强化学习】python 实现 q-learning 例二
本文作者:hhh5460 本文地址:https://www.cnblogs.com/hhh5460/p/10134855.html 问题情境 一个2*2的迷宫,一个入口,一个出口,还有一个陷阱.如图 ...
- Scala学习(七)练习
控制结构和函数 1. 编写示例程序,展示为什么 package com.horstmann.impatient 不同于 package com package horstmann package im ...
- 数组排列组合问题——BACKTRACKING
BACKTRACKING backtracking(回溯法)是一类递归算法,通常用于解决某类问题:要求找出答案空间中符合某种特定要求的答案,比如eight queens puzzle(将国际象棋的八个 ...
- list 的 增 删
增: 1. name = [] 2. name.append() 3. name.extend(name2) name2为可迭代的 name + name2 与之效果一样,合并为一个列表 4. nam ...
- 完整部署CentOS7.2+OpenStack+kvm 云平台环境(2)--云硬盘等后续配置
继上一篇博客介绍了完整部署CentOS7.2+OpenStack+kvm 云平台环境(1)--基础环境搭建,本篇继续讲述后续部分的内容 1 虚拟机相关1.1 虚拟机位置介绍 openstack上创建的 ...
- swap函数
#include<iostream> using namespace std; void swap(int& a,int& b){ int t=a; a=b; b=t; } ...
- 11.14 Daily Scrum
实现推荐菜谱时遇到问题,这个功能要和数据库和服务器有关,所以暂时放在一边,可能在beta版本实现. 部分成员已经完成基本任务,进行完善. Today's Task Tomorrow's Task ...
- Linux内核分析 期末总结
Linux内核分析 期末总结 一.知识概要 1. 计算机是如何工作的 存储程序计算机工作模型:冯诺依曼体系结构 X86汇编基础 会变一个简单的C程序分析其汇编指令执行过程 2. 操作系统是如何工作的 ...
- js/jquery禁止页面回退
$(function() { //防止页面后退 history.pushState(null, null, document.URL); window.addEventListener('popsta ...