洛谷 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\)个点,将其染成黑色, ...
随机推荐
- POJ1850&&1019&&1942
这三道题都水的难以想象,所以就放在一起写 1850 题目大意:有一种一种序列排列方式(如同题目中给出的例子),然后给你一个序列,问你这个序列的排名 首先我们先判断无解的情况,这个就很简单了. 由于题目 ...
- [Oracle]如何查看 10046 trace 中的 tim= ... 的具体时刻
可以在 Linux 下,用下列方式: 如10046 trace 文件中如果有如下的内容:... tim = 1503032923 可以用 date 命令加 option 来看它的时刻: date - ...
- gerrit代码简单备份方案分享
由于前期部署了gerrit代码审核系统,开发调整后的线上代码都放到gerrit上,这就要求我们要保证代码的安全.所以,对gerrit代码的备份至关重要! 备份的策略是:1)先首次将gerrit项目代码 ...
- 002-打开文件管理规范-20190406.bat
rem 002-打开文件管理规范-20190406.bat start /max https://www.cnblogs.com/delphixx/p/10652763.htmlcopy %~0 C: ...
- linux书籍
<鸟哥私房菜-基础版> <实战LINUX_SHELL编程与服务器管理> <LINUX命令行与SHELL脚本编程大全第2版].布卢姆.扫描版> <Linux初学 ...
- 理解Vue 2.5的Diff算法
DOM"天生就慢",所以前端各大框架都提供了对DOM操作进行优化的办法,Angular中的是脏值检查,React首先提出了Virtual Dom,Vue2.0也加入了Virtual ...
- Some questions after Reading 《移山之道》
很少见到用故事的形式来写技术书籍的,这是我看到的第一本,书写得比较有趣,看了之后也是有一定的收获. 作者在此书中旁征博引,引用的东西虽不能一个一个查询是否正确,但是每次读到时候,感觉一种现代的软件工 ...
- Daily Scrumming* 2015.12.19(Day 11)
一.团队scrum meeting照片 二.成员工作总结 姓名 任务ID 迁入记录 江昊 任务1090 https://github.com/buaaclubs-team/temp-front/com ...
- 软件工程导论课后习题Github作业(把一个英文句子中的单词次序逆序,单词中字母正常排列)
Java源代码 package yly; import java.util.Scanner; public class ruanjian { public static void main(St ...
- 使用a标签实现文件的下载与保存
<a>标签的常规使用是定义超链接,用于从一个页面链接到另一个页面,并且需要指定链接目标href,除了定义超链接外,<a>还可以实现文件的保存,直接设置a标签的href属性,但是 ...