标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的。现在你要处理的就是一段没有标点的文章。 一段文章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语言的更多相关文章

  1. BZOJ 1212: [HNOI2004]L语言 [AC自动机 DP]

    1212: [HNOI2004]L语言 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1367  Solved: 598[Submit][Status ...

  2. BZOJ 1212: [HNOI2004]L语言( dp + trie )

    因为单词很短...用trie然后每次dp暴力查找...用哈希+dp应该也是可以的.... ------------------------------------------------------- ...

  3. BZOJ 1212 HNOI2004 L语言 AC自己主动机(Trie树)+动态规划

    标题效果:给定词的列表,并m串 每个字符串q个最长前缀,这个前缀可满足拆分成一些字符串 这些字符串中存在的词汇太 再也不怕错误的数据范围--有一个很明显Trie树能解决的问题竟然被我写的AC自己主动机 ...

  4. bzoj 1212: [HNOI2004]L语言 AC自动机+状压

    为什么这道题网上所有题解写的都是N*Len的trie树的暴力啊,4E的复杂度... 为什么暴力还跑这么快啊TAT.. 有一个O(Len)的做法就是先把AC自动机建出来,因为每个字典串的长度很小,所以我 ...

  5. bzoj 1212: [HNOI2004]L语言

    思路:字典树+dp, dp[ i ] 表示 前缀到 i 能不能被理解, 如果dp[ i ] 是能被理解的那么, 把i + 1, i + 2 ....  在字典树上走,走到一个单词就转移. ,这样可行的 ...

  6. BZOJ 1212 [HNOI2004]L语言 【AC自动机 + 背包】

    题目链接[http://www.lydsy.com/JudgeOnline/problem.php?id=1212] 题意:给你一些单词,然后给出一个没有标点的文本串S,都是小写字符.现在让你求用给出 ...

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

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

  8. 洛谷(cogs 1293/bzoj 1212) P2292 [HNOI2004]L语言

    1293. [HNOI2004] L语言 ★★★   输入文件:language.in   输出文件:language.out   简单对比时间限制:1 s   内存限制:162 MB [题目描述] ...

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

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

随机推荐

  1. Working with Metal—Overview

    看完这个 WWDC 之后的总结. Metal 可以在单位时间内提供 10 倍的 draw call 调用. Background About Draw Call 每一次 draw call 调用都必须 ...

  2. Python之scrapy框架之post传输数据错误:TypeError: to_bytes must receive a unicode, str or bytes object, got int

    错误名:TypeError: to_bytes must receive a unicode, str or bytes object, got int 错误翻译:类型错误:to_bytes必须接收u ...

  3. [温故]图解java多线程设计模式(二)

    join & interrupt 这俩方法属于线程对象里的方法,属于线程本身的操作. join方法 用于等待一个线程的终止,等待期间将会阻塞,直到被等待的线程终止结束. 所以join可以用来做 ...

  4. WebGIS简单实现一个区域炫酷的3D立体地图效果

    1.别人的效果 作为一个GIS专业的,做一个高大上的GIS系统一直是我的梦想,虽然至今为止还没有做出一个理想中的系统,但是偶尔看看别人做的,学习下别人的技术还是很有必要的.眼睛是最容易误导我们的,有时 ...

  5. trace跟踪代码运行

    System.Diagnostics命名空间中. 1.Trace.Assert(a==12,"等于就不输出,不等于弹出对话框");   名称 描述   Assert(Boolean ...

  6. SQL Server性能监控常用语句

    .查找目前SQL Server所执行的SQL语法,并展示资源情况: SELECT s2.dbid , DB_NAME(s2.dbid) AS [数据库名] , --s1.sql_handle , ( ...

  7. java service wrapper将java程序包装成系统服务(一)

    一. 概述 使用java语言开发应用程序,在windows平台下,一般存在3种应用形式: 1. web应用.web应用多数打成war包在web容器(如tomcat,jetty等)中运行. 2. 桌面应 ...

  8. ifram的使用 左边是<a>链接 右边是对应网页嵌套的显示网页链接内容 和toggle的收放用法

    1.ifram的使用 左边是<a>链接  右边是对应网页嵌套的显示网页链接内容 <div class="container"> <div class= ...

  9. 17.Generator函数的异步应用

    异步编程对 JavaScript 语言太重要.Javascript 语言的执行环境是“单线程”的,如果没有异步编程,根本没法用,非卡死不可. 1.传统方法 ES6 诞生以前,异步编程的方法,大概有下面 ...

  10. Java网络编程(一)

    Java网络编程: 1.1: 网络编程:对于我这个“研究不深”的网络菜鸟来说,我觉得网络编程就是实现计算机与计算机之间通信的编程.写些能够实现计算机与计算机之间的通信就行了(目前来说). 1.2:一台 ...