在《信息学奥赛一本通提高篇》中 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的更多相关文章

  1. 洛谷 P2292 [HNOI2004] L语言 解题报告

    P2292 [HNOI2004] L语言 题目描述 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章\(T\)是由若干小写字母构成.一个单词 ...

  2. 洛谷P2292 [HNOI2004]L语言

    传送门 建好trie树 当$dp[j]==1$当且仅当存在$dp[k]=1$且$T[k+1,j]==word[i]$ 然后乱搞就行了 //minamoto #include<iostream&g ...

  3. 洛谷 P2292 [HNOI2004]L语言

    题目描述 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章T是由若干小写字母构成.一个单词W也是由若干小写字母构成.一个字典D是若干个单词的 ...

  4. 【洛谷P2292】L语言

    题目大意:给定一个长度为 N 的字符串和一个字典,字典中所有的字符串的长度均不超过 10,求给定的字符串从前往后最多有多少位可以与字典匹配. 题解:设 \(dp[i]\) 表示串的前 i 位是否能够与 ...

  5. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

  6. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.

    没有上司的舞会  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...

  7. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

  8. 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP

    题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...

  9. 洛谷P1710 地铁涨价

    P1710 地铁涨价 51通过 339提交 题目提供者洛谷OnlineJudge 标签O2优化云端评测2 难度提高+/省选- 提交  讨论  题解 最新讨论 求教:为什么只有40分 数组大小一定要开够 ...

随机推荐

  1. 码农英语四级考了6次,也能进知名IT外企

    程序员学英语 这显然不是新鲜的话题,但再怎么重复强调都不过分! 为啥要学 IT是当今世界发展最快的行业,没有之一!作为其中的从业人员,要始终保持对最新技术的关注度,难免需要阅读英文新闻或文章 平时工作 ...

  2. 什么是CDN?哪些是流行的jQuery CDN?使用CDN有什么好处?

    内容传送网络或内容分发网络(CDN)是部署在因特网上的多个数据中心的大型分布式服务器系统.CDN的目标是为具有高可 用性和高性能的最终用户提供内容. 有3个流行的jQuery CDN:谷歌,微软jQu ...

  3. 配置NFS实现nginx动静分离

    案例子任务一.安装配置NFS服务器 步骤1:使用docker容器配置NFS服务器 启动centos容器并进入 docker run -d --privileged centos:v1 /usr/sbi ...

  4. WebSocket协议 与 IO多路复用

    最近在把 Facebook Message 接入客服系统,由于与 Facebook Message 对接的收发消息都是通过调用 http 接口来实现的,如果想实现即时通讯,还需要在中间加一个 WebS ...

  5. java操作HDFS相关demo(TDH,kerberos认证)

    public class Test {     private static Configuration conf;     private static FileSystem fs;     //开 ...

  6. Spring(3) --事务,隔离级别,设计模式

    什么是事务?事物的四大特性? 事务是指单个逻辑工作单元执行的一系列操作(ACID),这些操作要么全部执行,要么全部不执行,是不可中断的. (1)原子性(Atomicity)是指事务所有操作是不可中断的 ...

  7. netty核心组件之channel、handler、ChannelHandlerContext、pipeline

    channel介绍: netty中channel分为NioServerScoketChannel和NioSocketChannel,分别对应java nio中的ServerScoketChannel和 ...

  8. 第6章 未来的函数:生成器和promise

    目录 1. 生成器函数 1.1 定义生成器函数 1.2 迭代器对象 1.3 对迭代器进行迭代 1.4 把执行权交给下一个生成器 2. 使用生成器 2.1 用生成器生成ID 2.2 用迭代器遍历DOM树 ...

  9. Java的nanoTime()方法

    java有两个获取和时间相关的秒数方法,一个是广泛使用的 System.currentTimeMillis() 返回的是从一个长整型结果,表示毫秒. 另一个是 System.nanoTime() 返回 ...

  10. Windows软件Everything的配置

    Everything配置 Everything是一款Windows下的搜索软件,怎么安装应该不难.这里说一下个人使用的两个习惯. 主要就两点,一个是快捷键,一个是搜索路径 1. 快捷键 配置快捷键,点 ...