洛谷P2292
在《信息学奥赛一本通提高篇》中 Trie字典树 的课后练习看到这道题
然后我就用 Trie字典树 做了这道题
听说这道题的正解是 AC自动机,数据跑满时其他的算法都可以卡掉
然而数据没那么强,我终究是过了
Description
给定 \(n\) 个词汇,\(m\) 个语句,每个语句由若干个词汇连续构成,每个词汇由若干个字符连续构成
对于一个词汇,当且仅当这个词汇能被完整的识别,也就是属于给定的词汇中的一个时,我们称 已理解此词汇
对于一个语句,当且仅当其中的任意一个词汇之前的所有词汇都已被理解时,才可以开始识别此词汇
现在对于每个语句,要求输出其最后一个能被理解的词汇的末尾位置的下标
Solution
这里讲一下如何用踹树去做这道题
首先看样例
4 3
is
name
what
your
whatisyourname
whatisyouname
whaisyourname
这是给定的词汇和语句,思考一下该如何去从头识别每一个语句中的词汇
根据踹树的原理可知,我们可以以每个给定词汇为一个分支,以每个字符作为转移条件,建一棵踹树
具体如图所示:

每次从根节点开始向下遍历,每理解一个词汇计数器就更新
若遍历出错,则直接返回答案
若已遍历到叶节点显示还未出错,则返回根节点找下一个词汇,直到出错或者整个语句已全部被理解
然后就可以极慢地找出每个语句能被理解到的最末位置
在此基础上,我们维护两个 \(map\),一个记录当前语句是否被理解过,另一个统计当前语句能被理解到的最末位置
原因是在某些情况下,同样的运算步骤可能会重复很多遍,但使用映射 \(map\) 就可以解决这个问题,相当于递归时的记忆化
当第一个 \(map\) 显示当前语句已被理解过时,直接用另一个 \(map\) 输出对应的最末位置,可以避免再重新识别当前这个已经被理解过一次的语句
这样就可以使得这个时间复杂度非常差的做法稍微快一点
Other things
以上显然是一个暴力的做法,纯属乱搞
然而踹树本身就不是本题的正解,如果能过那就是因为数据过水
本着尊重《信息学奥赛一本通提高篇》的编者的原则,我才用他所指定的这个做法来做这道题
至于这道题的正解 AC自动机
我不会 蛤蛤
Code
#include<map>
#include<queue>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define maxn 200010
#define LL long long
#define uLL unsigned long long
using namespace std;
int n,m,ans;
char s[25],S[maxn];
map<string,int> Get;
map<string,bool> Judge;
inline int read(){
int s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=(s<<1)+(s<<3)+ch-'0',ch=getchar();
return s*w;
}
struct Trie{
int Nxt[maxn][25],cnt;
bool flag[maxn],vis[maxn];
void Insert(char *s){
int p=0,len=strlen(s+1);
for(int i=1;i<=len;i++){
int c=s[i]-'a';
if(!Nxt[p][c]) Nxt[p][c]=++cnt;
p=Nxt[p][c];
}
flag[p]=1;
}
int Find(char *s){
int p=0,len=strlen(s+1);
if(Judge[s+1]) return Get[s+1];
memset(vis,false,sizeof vis);vis[0]=true;
for(int i=0;i<=len;i++){
if(!vis[i]) continue;cnt=i;
for(int j=i+1;j<=len;j++){
int c=s[j]-'a';
p=Nxt[p][c];if(!p) break;
if(flag[p]) vis[j]=true;
}
}
Judge[s+1]=true;Get[s+1]=cnt;
return cnt;
}
}Tri;
int main(){
n=read();m=read();
for(int i=1;i<=n;i++){
scanf("%s",s+1);
Tri.Insert(s);
}
for(int i=1;i<=m;i++){
scanf("%s",S+1);
printf("%d\n",Tri.Find(S));
}
return 0;
}
洛谷P2292的更多相关文章
- 洛谷 P2292 [HNOI2004] L语言 解题报告
P2292 [HNOI2004] L语言 题目描述 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章\(T\)是由若干小写字母构成.一个单词 ...
- 洛谷P2292 [HNOI2004]L语言
传送门 建好trie树 当$dp[j]==1$当且仅当存在$dp[k]=1$且$T[k+1,j]==word[i]$ 然后乱搞就行了 //minamoto #include<iostream&g ...
- 洛谷 P2292 [HNOI2004]L语言
题目描述 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章T是由若干小写字母构成.一个单词W也是由若干小写字母构成.一个字典D是若干个单词的 ...
- 【洛谷P2292】L语言
题目大意:给定一个长度为 N 的字符串和一个字典,字典中所有的字符串的长度均不超过 10,求给定的字符串从前往后最多有多少位可以与字典匹配. 题解:设 \(dp[i]\) 表示串的前 i 位是否能够与 ...
- 洛谷1640 bzoj1854游戏 匈牙利就是又短又快
bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...
- 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.
没有上司的舞会 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...
- 洛谷P1108 低价购买[DP | LIS方案数]
题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...
- 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP
题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...
- 洛谷P1710 地铁涨价
P1710 地铁涨价 51通过 339提交 题目提供者洛谷OnlineJudge 标签O2优化云端评测2 难度提高+/省选- 提交 讨论 题解 最新讨论 求教:为什么只有40分 数组大小一定要开够 ...
随机推荐
- 卷积网络可解释性复现 | Grad-CAM | ICCV | 2017
觉得本文不错的可以点个赞.有问题联系作者微信cyx645016617,之后主要转战公众号,不在博客园和CSDN更新. 论文名称:"Grad-CAM: Visual Explanations ...
- 手写简易版RPC框架基于Socket
什么是RPC框架? RPC就是远程调用过程,实现各个服务间的通信,像调用本地服务一样. RPC有什么优点? - 提高服务的拓展性,解耦.- 开发人员可以针对模块开发,互不影响.- 提升系统的可维护性及 ...
- Raft算法系列教程4:日志不一致的解决
网络不可能一直处于正常情况,因为Leader或者某个Follower有可能会崩溃,从而导致日志不能一直保持一致.因此存在以下三种情况: (1)Follower缺失当前Leader上存在的日志条目.(2 ...
- MongoDb二
获取集合的时候,可以传入bean的class文件.来实现数据的绑定.在这之前.需要自定义一个Codec类.进行数据的转换. MongoClient client=new MongoClient(new ...
- MySQL性能优化,MySQL索引优化,order by优化,explain优化
前言 今天我们来讲讲如何优化MySQL的性能,主要从索引方面优化.下期文章讲讲MySQL慢查询日志,我们是依据慢查询日志来判断哪条SQL语句有问题,然后在进行优化,敬请期待MySQL慢查询日志篇 建表 ...
- vue-element Form表单验证(表单验证没错却一直提示错误)
在使用element-UI 的表单时,发生一个验证错误,例如已输入值但求验证纠错: 代码如下所示: <el-form :model="correction" :i ...
- CSS&&label_div
Css-div部分 本章主要内容 0.基础知识 1.CSS概述 2.CSS基础语法 3.CSS选择器 4.CSS主要属性 5.CSS核心机制-盒子模型 6.CSS重点和难点-定位 7.综合示例 基础知 ...
- 2021年了,`IEnumerator`、`IEnumerable`还傻傻分不清楚?
IEnumerator.IEnumerable这两个接口单词相近.含义相关,傻傻分不清楚. 入行多年,一直没有系统性梳理这对李逵李鬼. 最近本人在怼着why神的<其实吧,LRU也就那么回事> ...
- 剑指offer 面试题9:用两个栈实现队列
题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 使用栈实现队列的下列操作:push(x) -- 将一个元素放入队列的尾部.pop() -- 从队列首部移 ...
- 基于 MPI/OpenMP 混合编程的大规模多体(N-Body)问题仿真实验
完整代码: #include <iostream> #include <ctime> #include <mpi.h> #include <omp.h> ...