[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 ... 
随机推荐
- Linux一键脚本合集vps
			首先,想说说一键脚本流行的原因何在? 众所周知的是,Linux 是占据大半壁江山的服务器系统,但在桌面上的占有率可就远不是那么回事儿了,使用和熟悉 Linux 的人远没有 Windows 多,但又因为 ... 
- 安装Ubuntu桌面环境后只能Guest登录的解决办法
			1.安装Ubuntu桌面环境后,登录界面只显示了Guest 2.在登录界面按住crtl+shift+F1,进入tty模式 3.输入sudo -s进入root模式 4.输入vi /etc/lightdm ... 
- CUDA:Supercomputing for the Masses (用于大量数据的超级计算)-第一节
			原文链接 第一节 CUDA 让你可以一边使用熟悉的编程概念,一边开发可在GPU上运行的软件. Rob Farber 是西北太平洋国家实验室(Pacific Northwest National Lab ... 
- Nginx学习记录(二)
			1. 什么是反向代理 正向代理 反向代理: 反向代理服务器决定哪台服务器提供服务. 返回代理服务器不提供服务器.也是请求的转发. 反向代理(Reverse Proxy)方式是指以代理服务器来接受Int ... 
- 详解JVM工作原理和特点
			在我们运行和调试Java程序的时候,经常会提到一个JVM的概念.本文将为大家讲解JVM工作原理和特点,希望对大家有所帮助. AD:网+线下沙龙 | 移动APP模式创新:给你一个做APP的理由>& ... 
- wepy一些问题和解决方案
			wepy一些问题和解决方案 小程序开发和传统的web开发有相识的地方,但是也有不同的地方,要区分. computed属性名和props属性名重复 如果那个组件的渲染值是重名的computed属性,每次 ... 
- SAP 日志管理
			现在项目上自开发的dialog程序越来越多,有很多敏感数据需要像SAP标准的业务一样,能看到所有的修改日志,要想实现日志的功能,有以下几个办法: 办法一.建一个日志表,在原有表的基础上,加上日期和时间 ... 
- Linux入门-第八周
			1.用shell脚本实现自动登录机器 #!/usr/bin/expectset ip 192.168.2.192set user rootset password rootspawn ssh $use ... 
- centos7.3网络配置
			一.关闭NetworkManager 默认状态下最小化安装使用NetworkManager这个服务来控制联网的,但是这个配置在配置生产环境服务器时一般不会使用,而是使用系统自带的network服务,更 ... 
- [原]sencha touch之panel和tabpanel
			最近在弄senchatouch的项目,所以边学习边开发,边记录,直接记录下test code如下: Panel: Ext.application({ name:'itKingApp', launch: ... 
