[HNOI2004][bzoj1212] L语言 [Trie+dp]
题面
思路
无后效性
显然,不管某个前缀的理解方式是怎么样的,如果它能被理解,那么前面的决策对于后面的决策而言都是等价的
因此这题可以DP
DP方程
令$dp[i]$表示前缀i是否能被理解
那么,显然状态转移方程为:
$dp[i]=dp[i]||dp[j];;(s[j+1...i]\in D)$
也就是说,现在我们的问题转化为:求第i位往前数可以匹配的所有单词
因为这个往前数的方向和方式是唯一的,所以我们想到一个字符串数据结构:$Trie$
$Trie$
一个非常常规的想法,就是把所有单词插到$trie$里面,然后用这个往前数的子串去匹配单词
但是这样有一个问题:我们是从$trie$的某一个深层次位置往根匹配,而这样的开始节点可能有多个
这个问题出现的根本原因,是因为我们是拿一个后缀去匹配单词的,但是我们的$trie$以前缀方式保存
所以,我们只要把$trie$保存的方式从前缀变成后缀就好了
我们把所有单词反向,插入$trie$里面
求$dp[i]$的时候,从$s[i]$开始往前,$trie$从根节点开始,向下走,走到一个单词的结尾(实际上反过来以后就是单词的开头),就用这个位置更新$dp[i]$
总时间效率上限:
$O\left(m\left(10strlen(s)+O\left(Trie\right)\right)\right)=O\left(2\ast10^8\right)$
但是一般达不到这么多,我的代码最后一个点272ms,还是很稳的
实在不行,给评测机吸氧啊【雾】
Code:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct node{//trie节点
int num,son[27];
node(){num=0;memset(son,0,sizeof(son));}
}x[210];
int n,m,dp[1000010],cnt;char a[1000010];
void add(char s[20]){//插入单词
int len=strlen(s),cur=0,i;
for(i=len-1;i>=0;i--){
if(!x[cur].son[s[i]-'a']) x[cur].son[s[i]-'a']=++cnt;
cur=x[cur].son[s[i]-'a'];
}
x[cur].num++;
}
void check(char s[],int pos){
int cur=0,i,flag=0;
for(i=pos-1;i>=0;i--){
if(!x[cur].son[s[i]-'a']) break;
cur=x[cur].son[s[i]-'a'];if(x[cur].num&&dp[i]) flag=1;
}
dp[pos]=flag;
}
int main(){
scanf("%d%d",&n,&m);int i,len,l,j,ans;char s[20];
for(i=1;i<=n;i++) scanf("%s",s),add(s);
for(l=1;l<=m;l++){
scanf("%s",a);memset(dp,0,sizeof(dp));
dp[0]=1;len=strlen(a);ans=0;
for(i=1;i<=len;i++){
check(a,i);
if(dp[i]) ans=max(i,ans);
}
printf("%d\n",ans);
}
}
[HNOI2004][bzoj1212] L语言 [Trie+dp]的更多相关文章
- Luogu P2292 [HNOI2004]L语言(Trie+dp)
P2292 [HNOI2004]L语言 题面 题目描述 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章 \(T\) 是由若干小写字母构成. ...
- 洛谷.2292.[HNOI2004]L语言(Trie DP)
题目链接 /* 简单的DP,查找是否有字典中的单词时在Trie树上做 要注意在最初Match(0)一遍后,i还是要从0开始匹配,因为如果有长度为1的单词,Match(i+1)不会从1更新 1M=102 ...
- [HNOI2004]Language L语言
2777: [HNOI2004]Language L语言 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 10 Solved: 5[Submit][S ...
- 【BZOJ1212】[HNOI2004]L语言 Trie树
[BZOJ1212][HNOI2004]L语言 Description 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章T是由若干小写字母构 ...
- 洛谷:P2292 [HNOI2004]L语言(DP+Trie树)
P2292 [HNOI2004]L语言 题目链接:https://www.luogu.org/problemnew/show/P2292 题目描述 标点符号的出现晚于文字的出现,所以以前的语言都是没有 ...
- BZOJ1212[HNOI2004]L语言——trie树+DP
题目描述 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章T是由若干小写字母构成.一个单词W也是由若干小写字母构成.一个字典D是若干个单词的 ...
- BZOJ1212: [HNOI2004]L语言(Trie图+DP)
Description 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章T是由若干小写字母构成.一个单词W也是由若干小写字母构成.一个字典D ...
- [HNOI2004]L语言 trie树? Ac自动机? hash!!
题目描述 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章T是由若干小写字母构成.一个单词W也是由若干小写字母构成.一个字典D是若干个单词的 ...
- BZOJ 1212: [HNOI2004]L语言 trie
长度小于 10 是关键信息~ #include <cstdio> #include <cstring> #include <algorithm> #define N ...
随机推荐
- Jmeter命令行参数
一.在linux中,使用非gui的方式执行jmeter.若需更改参数,必须先编辑jmx文件,找到对应的变量进行修改,比较麻烦.因此,可以参数化一些常用的变量,直接在Jmeter命令行进行设置 二.参数 ...
- js调用后台,后台调用前台等方法总结
1. javaScript函数中执行C#代码中的函数:方法一:1.首先建立一个按钮,在后台将调用或处理的内容写入button_click中; 2.在前台写一个js函数,内容为docume ...
- java基础必备单词讲解 day one
computer 电脑 computer path 路径 配置jdk环境 class 类 classpath 类路径 编译好的文件执行路径 public 公共的 private 私有的 static ...
- Spring+ ApplicationListener
有时候 需要在容器初始化完成后,加载些 代码字典或不常变的信息 放入缓存之类的,这里使用spring 初始化bean,并实例化 1.创建一个ApplicationListener类 import o ...
- day03_基本数据类型基本运算
1.什么是数据类型 变量值才是我们存储的数据,所以数据类指的就是变量值的不同种类 2.为何数据要分类型? 变量值是用来保存现实世界中的状态的,那么针对不同的状态就应该用不同类型的数据去表示 3.如何用 ...
- 第37课 thinkphp5添加商品基本信息及通过前置钩子上传商品主图 模型事件(勾子函数)
目录 手册地址: before_insert(新增之前的操作) 要实现的功能 思路 触发条件: 1. 控制器里必须要调用模型的save()方式保存数据,用insert()触发不了勾子函数的 2. 模型 ...
- SHELL脚本的常规命令
**shell脚本的执行方式: 方法一:首先赋予x权限,再输入相对路径或绝对路径,./testdot.sh或/root/shell/testdot.sh 方法二:sh testdot.sh(会新开一个 ...
- Tempter of the Bone HDU - 1010(dfs)
Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- [GDOI2016][树链剖分+主席树]疯狂动物城
题面 Description Nick 是只在动物城以坑蒙拐骗为生的狐狸,儿时受到偏见的伤害,放弃了自己的理想.他被兔子 Judy 设下圈套,被迫与她合作查案,而卷入意想不到的阴谋,历尽艰险后成为搭档 ...
- 编译Kubelet二进制文件
1. 环境 系统:CentOS 7.2 Go:1.10.3 Kubernetes:1.10.4 2. 安装最新版go 编译的Kubernetes 1.10.4要求go版本在1.9.3以上,使用下面的y ...