BZOJ P1212 [HNOI2004] L语言
标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的。现在你要处理的就是一段没有标点的文章。 一段文章T是由若干小写字母构成。一个单词W也是由若干小写字母构成。一个字典D是若干个单词的集合。 我们称一段文章T在某个字典D下是可以被理解的,是指如果文章T可以被分成若干部分,且每一个部分都是字典D中的单词。 例如字典D中包括单词{‘is’, ‘name’, ‘what’, ‘your’},则文章‘whatisyourname’是在字典D下可以被理解的 因为它可以分成4个单词:‘what’, ‘is’, ‘your’, ‘name’,且每个单词都属于字典D,而文章‘whatisyouname’ 在字典D下不能被理解,但可以在字典D’=D+{‘you’}下被理解。这段文章的一个前缀‘whatis’,也可以在字典D下被理解 而且是在字典D下能够被理解的最长的前缀。 给定一个字典D,你的程序需要判断若干段文章在字典D下是否能够被理解。 并给出其在字典D下能够被理解的最长前缀的位置。
--byBZOJ
http://www.lydsy.com/JudgeOnline/problem.php?id=1212
算是AC-自动机?DP?
好吧也许不算;
她就是个Trie上的暴力么。。。
对文章的每个前缀f[i](长度为i)
f[i]合法,仅当存在:f[j](j<i)合法,且j+1到i为一个单词
然后,就对于每个i,枚举j(i-j>10):使f[j]合法,且j+1到i能被一个单词匹配
对了就是匹配,建个AC-自动机,因为连fail都不(能)用,所以也就是个trie树了,对j+1到i进行匹配就行了。
代码如下:
#include<cstdio>
#include<cstring>
using namespace std;
int m,n;
char s[];
char word[];
struct ss{
int ch[];
}trie[];
int tot,biggest,smallest;
int is_end[],fail[];
int f[];
int que[];
void bfs_fail();
void compare();
int main()
{
int i,j,k,len;
scanf("%d%d",&n,&m);
for(i=;i<=n;i++){
getchar();
scanf("%s",s);
len=strlen(s)-;k=;
if(len>biggest)biggest=len;
if(len<smallest)smallest=len;
for(j=;j<=len;j++){
if(!trie[k].ch[s[j]-'a'])
trie[k].ch[s[j]-'a']=++tot;
k=trie[k].ch[s[j]-'a'];
}
is_end[k]=;
}
for(i=;i<=m;i++){
getchar();
scanf("%s",word);
compare();
}
return ;
}
void compare(){
memset(f,,sizeof(f));
int i,j,tem1=,tem2=,ans=,len=strlen(word)-;
f[]=;
for(i=;i<=len+;i++){
for(j=i-smallest+;j>=&&j>=i-biggest-;j--)
if(f[j]){
tem1=;tem2=j;
while(tem2<=i-){
if(trie[tem1].ch[word[tem2]-'a']){
tem1=trie[tem1].ch[word[tem2]-'a'];
tem2++;
}
else
break;
}
if(tem2==i&&is_end[tem1]){
f[i]=;
ans=i;
break;
}
}
}
printf("%d\n",ans);
}
祝AC哟!
BZOJ P1212 [HNOI2004] L语言的更多相关文章
- BZOJ 1212: [HNOI2004]L语言 [AC自动机 DP]
1212: [HNOI2004]L语言 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1367 Solved: 598[Submit][Status ...
- BZOJ 1212: [HNOI2004]L语言( dp + trie )
因为单词很短...用trie然后每次dp暴力查找...用哈希+dp应该也是可以的.... ------------------------------------------------------- ...
- BZOJ 1212 HNOI2004 L语言 AC自己主动机(Trie树)+动态规划
标题效果:给定词的列表,并m串 每个字符串q个最长前缀,这个前缀可满足拆分成一些字符串 这些字符串中存在的词汇太 再也不怕错误的数据范围--有一个很明显Trie树能解决的问题竟然被我写的AC自己主动机 ...
- bzoj 1212: [HNOI2004]L语言 AC自动机+状压
为什么这道题网上所有题解写的都是N*Len的trie树的暴力啊,4E的复杂度... 为什么暴力还跑这么快啊TAT.. 有一个O(Len)的做法就是先把AC自动机建出来,因为每个字典串的长度很小,所以我 ...
- bzoj 1212: [HNOI2004]L语言
思路:字典树+dp, dp[ i ] 表示 前缀到 i 能不能被理解, 如果dp[ i ] 是能被理解的那么, 把i + 1, i + 2 .... 在字典树上走,走到一个单词就转移. ,这样可行的 ...
- BZOJ 1212 [HNOI2004]L语言 【AC自动机 + 背包】
题目链接[http://www.lydsy.com/JudgeOnline/problem.php?id=1212] 题意:给你一些单词,然后给出一个没有标点的文本串S,都是小写字符.现在让你求用给出 ...
- BZOJ 1212: [HNOI2004]L语言 trie
长度小于 10 是关键信息~ #include <cstdio> #include <cstring> #include <algorithm> #define N ...
- 洛谷(cogs 1293/bzoj 1212) P2292 [HNOI2004]L语言
1293. [HNOI2004] L语言 ★★★ 输入文件:language.in 输出文件:language.out 简单对比时间限制:1 s 内存限制:162 MB [题目描述] ...
- 【BZOJ1212】[HNOI2004]L语言 Trie树
[BZOJ1212][HNOI2004]L语言 Description 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章T是由若干小写字母构 ...
随机推荐
- 架构师养成记--19.netty
一.Netty初步 为什么选择Netty? 和NIO比较,要实现一个通信要简单得很多,性能很好.分布式消息中间件.storm.Dubble都是使用Netty作为底层通信. Netty5.0要求jdk1 ...
- CUDA安装
1.CUDA是什么? CUDA(Compute Unified Device Architecture),显卡厂商NVidia推出的运算平台. 随着显卡的发展,GPU越来越强大,而且GPU为显示图像做 ...
- Eclipse安装genymotion最新的方法
https://www.cnblogs.com/WXBai/p/5938884.html 安卓开发: http://tools.android-studio.org/index.php/sdkhttp ...
- [Alpha]团队任务拆解
要求 团队任务拆解 Alpha阶段总体规划 初步实现测试.报告: 实现对游戏最基本的测试,包括内置随机测试.提供可供选择的组合测试 实现对游戏测试时操作的记录并最终生成报告 能够在发现异常时及时将异常 ...
- 解决flex布局下, elementui table组件不能跟随父组件的宽度而变化的bug
bug: 我在flex布局的元素中使用了elementui的table组件,饿了么的table上会被加一个动态的宽度, 当第一次改变flex元素宽度的时候.table的动态宽度会变化,第二次和以后就不 ...
- 等价类计数问题(Polya定理和burnside引理)
零.约定: (置换等名词会在前置知识中有解释) \(1.\)在本文中,题目要求的染色方案等统称为"元素". \(2.\)两个元素严格相等我们记做"\(=\)", ...
- Vue 混入(mixins)
详细参考官方文档 基础 混入 (mixins) 是一种分发 Vue 组件中可复用功能的非常灵活的方式.混入对象可以包含任意组件选项.当组件使用混入对象时,所有混入对象的选项将被混入该组件本身的选项. ...
- Mac下Go2Shell配合ITerm2无法定位到当前文件夹目录的解决方法
下载最新版,这个问题在最新版已经完美解决. http://zipzapmac.com/go2shell
- (转)我是如何在SQLServer中处理每天四亿三千万记录的
首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文中有不对的地方,请各位数据库大牛给予指正,以便我能够更好的处理此次业务. ...
- SQL LIKE 通配符随笔
通配符 说明 _ 与任意单字符匹配 % 与包含一个或多个字符的字符串匹配 [ ] 与特定范围(例如,[a-f])或特定集(例如,[abcdef])中的任意单字符匹配. [^] 与特定范 ...