题面

传送门

思路

无后效性

显然,不管某个前缀的理解方式是怎么样的,如果它能被理解,那么前面的决策对于后面的决策而言都是等价的

因此这题可以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]的更多相关文章

  1. Luogu P2292 [HNOI2004]L语言(Trie+dp)

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

  2. 洛谷.2292.[HNOI2004]L语言(Trie DP)

    题目链接 /* 简单的DP,查找是否有字典中的单词时在Trie树上做 要注意在最初Match(0)一遍后,i还是要从0开始匹配,因为如果有长度为1的单词,Match(i+1)不会从1更新 1M=102 ...

  3. [HNOI2004]Language L语言

    2777: [HNOI2004]Language L语言 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 10  Solved: 5[Submit][S ...

  4. 【BZOJ1212】[HNOI2004]L语言 Trie树

    [BZOJ1212][HNOI2004]L语言 Description 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章T是由若干小写字母构 ...

  5. 洛谷:P2292 [HNOI2004]L语言(DP+Trie树)

    P2292 [HNOI2004]L语言 题目链接:https://www.luogu.org/problemnew/show/P2292 题目描述 标点符号的出现晚于文字的出现,所以以前的语言都是没有 ...

  6. BZOJ1212[HNOI2004]L语言——trie树+DP

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

  7. BZOJ1212: [HNOI2004]L语言(Trie图+DP)

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

  8. [HNOI2004]L语言 trie树? Ac自动机? hash!!

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

  9. BZOJ 1212: [HNOI2004]L语言 trie

    长度小于 10 是关键信息~ #include <cstdio> #include <cstring> #include <algorithm> #define N ...

随机推荐

  1. 【HHHOJ】NOIP2018 模拟赛(二十四) 解题报告

    点此进入比赛 得分: \(100+60+100\)(挺好的,涨了一波\(Rating\)) 排名: \(Rank\ 1\) \(Rating\):\(+115\) \(T1\):[HHHOJ13]金( ...

  2. python_60_装饰器3

    #嵌套函数 def foo(): print('in the foo') def bar(): print('in the bar') bar() #bar()#出错,无法在外边调用,bar函数的作用 ...

  3. Unity的sendmessage用法

    刚学完sendmessage用法,自己也尝试测试了一下,用法如下: 1.在unity2017新建一个场景test 2.在场景中添加一个立方体cube作为主角,另添加一个胶囊体capsule,调整为如图 ...

  4. CentOS启动时自动加载内核模块

    要想在CentOS中自动加载内核模块,需要在/etc/sysconfig/modules/目录中增加一个脚本,在此脚本中加载所需的模块. 下面是我所用的一个名为8021q.modules的脚本,用来在 ...

  5. VueX源码分析(3)

    VueX源码分析(3) 还剩余 /module /plugins store.js /plugins/devtool.js const devtoolHook = typeof window !== ...

  6. jpeg解码库使用实例

    jpeg库下载地址: http://www.ijg.org/ 交叉编译三部曲: A ./configure --host=arm-linux-gcc --prefix=/home/flying/jpe ...

  7. SAP销售订单屏幕增强行项目屏幕增强

    1.在vbap表中 append一个自定义结构,如下图: 2.TCODE:SE80     程序名:SAPMV45A   屏幕:8459 如图: 3.标记增强的屏幕字段 4.屏幕增强的位置 *& ...

  8. vue-cli的build的文件夹下没有dev-server.js文件,怎么配置mock数据

    因为最新版本的vue-cli已经放弃dev-server.js,只需在webpack.dev.conf.js配置就行 新版webpack.dev.conf.js配置如下: 在const portfin ...

  9. mysql的性能优化案例

    在一次项目实现中,以前写了个程序,将在txt文件中的电话号码和对应的类型往数据库中插入,小数据量的情况下,用个数组遍历循环的方式,很容易解决,但是当数据量一下 但是,几十万个电话一次性插入,就变得耗时 ...

  10. Flask初学者:Python虚拟环境,Flask安装,helloworld,run方法

    一.Python虚拟环境: 作用:使Python框架的不同版本可以在同一台电脑上运行.如果在电脑上全局(C盘或者其他目录)安装Flask(或其他Python框架),当你使用其他版本的Flask(比如有 ...