1212: [HNOI2004]L语言

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 643  Solved: 252
[Submit][Status]

Description

标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的。现在你要处理的就是一段没有标点的文章。 一段文章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下能够被理解的最长前缀的位置。

Input

输入文件第一行是两个正整数n和m,表示字典D中有n个单词,且有m段文章需要被处理。 之后的n行每行描述一个单词,再之后的m行每行描述一段文章。 其中1<=n, m<=20,每个单词长度不超过10,每段文章长度不超过1M。

Output

对于输入的每一段文章,你需要输出这段文章在字典D可以被理解的最长前缀的位置。

Sample Input

4 3
is
name
what
your
whatisyourname
whatisyouname
whaisyourname

Sample Output

14
6
0 整段文章’whatisyourname’都能被理解
前缀’whatis’能够被理解
没有任何前缀能够被理解

HINT

 

Source

题解:我真心不明白这道题为啥会被上一个DP的标签。。。觉得好晕。。。
说思路——先是根据字典建立AC自动机,然后用这个跑啊跑,跑啊跑。。。用一个数组记录下长度为N的前缀是否可以被接受,然后跑啊跑,跑啊跑,别的没了。。。几乎是AC自动机裸题啊(HansBug:居然比phile快了耶,我2352ms,你可是3000+ms哦么么哒 phile:呵呵呵好吧我也是醉了)
 type
point=^node;
node=record
st:ansistring;
ex:longint;
jump,fat:point;
next:array['A'..'Z'] of point;
end;
var
i,j,k,l,m,n:longint;
head,p1,p2:point;
s1:ansistring;
a:array[..] of longint;
function getpoint:point;
var p1:point;c1:char;
begin
new(p1);
p1^.ex:=;
p1^.st:='';
p1^.fat:=nil;
p1^.jump:=head;
for c1:='A' to 'Z' do p1^.next[c1]:=nil;
getpoint:=p1;
end;
procedure ins(s1:ansistring);
var
s2:ansistring;
i,j,k,l:longint;
p1,p2:point;
begin
p1:=head;s2:='';
for i:= to length(s1) do
begin
s2:=s2+s1[i];
if p1^.next[s1[i]]=nil then
begin
p2:=getpoint;
p2^.st:=s2;
p2^.fat:=p1;
p1^.next[s1[i]]:=p2;;
end;
p1:=p1^.next[s1[i]];
if i=length(s1) then p1^.ex:=;
end;
end;
procedure linkit;
var
i,j,k,l,f,r:longint;
p1,p2:point; c1:char;
d:array[..] of point;
begin
f:=;r:=;
d[]:=head;
while f<r do
begin
for c1:='A' to 'Z' do
begin
if d[f]^.next[c1]<>nil then
begin
d[r]:=d[f]^.next[c1];
if (d[f]<>head) then
begin
p2:=d[f]^.jump;
while (p2^.next[c1]=nil) and (p2<>head) do p2:=p2^.jump;
if p2^.next[c1]<>nil then d[r]^.jump:=p2^.next[c1];
end;
inc(r);
end;
end;
inc(f);
end;
end;
function cal(s1:ansistring):longint;
var
i,j,k,l:longint;
p1,p2:point;
begin
p1:=head;l:=;
fillchar(a,sizeof(a),);
a[]:=;
for i:= to length(s1) do
begin
if p1^.next[s1[i]]=nil then
begin
while (p1^.next[s1[i]]=nil) and (p1<>head) do p1:=p1^.jump;
if p1^.next[s1[i]]<>nil then p1:=p1^.next[s1[i]]
end
else p1:=p1^.next[s1[i]];
p2:=p1;
while p2<>head do
begin
if (p2^.ex=) and (a[i-length(p2^.st)]=) then
begin
a[i]:=;
l:=i;break;
end;
p2:=p2^.jump;
end;
end;
exit(l);
end; begin
readln(n,m);head:=getpoint;
head^.jump:=head;
for i:= to n do
begin
readln(s1);
ins(upcase(s1));
end;
linkit;
for i:= to m do
begin
readln(s1);
writeln(cal(upcase(s1)));
end;
readln;
end.

1212: [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自动机 + 背包】

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

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

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

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

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

  6. bzoj 1212: [HNOI2004]L语言

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

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

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

  8. bzoj1212: [HNOI2004]L语言(字典树)

    1212: [HNOI2004]L语言 题目:传送门 题解: 看完题目之后就觉得可以暴力在字典树上之间询问,一开始还傻了以为用文章来建,肯定用单词啊: 那么我们可以用一个v数组表示当前字符串1~i的区 ...

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

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

随机推荐

  1. NOIP 提高组必会!(转)

    1.排序算法(快排.选择.冒泡.堆排序.二叉排序树.桶排序)2.DFS/BFS 也就是搜索算法,剪枝务必要学! 学宽搜的时候学一下哈希表!3.树 ①遍历 ②二叉树 ③二叉排序树(查找.生成.删除) ④ ...

  2. Java学习之旅基础知识篇:数组及引用类型内存分配

    在上一篇中,我们已经了解了数组,它是一种引用类型,本篇将详细介绍数组的内存分配等知识点.数组用来存储同一种数据类型的数据,一旦初始化完成,即所占的空间就已固定下来,即使某个元素被清空,但其所在空间仍然 ...

  3. Spring4.14 事务异常 NoUniqueBeanDefinitionException: No qualifying bean of type [....PlatformTransactionManager]

    环境为Spring + Spring mvc + mybatis:其中Spring版本为4.1.4 spring配置文件: <?xml version="1.0" encod ...

  4. Bootstrap入门(二十二)组件16:列表组

    Bootstrap入门(二十二)组件16:列表组 列表组是灵活又强大的组件,不仅能用于显示一组简单的元素,还能用于复杂的定制的内容. 1.默认样式列表组 2.加入徽章 3.链接 4.禁用的列表组 5. ...

  5. [源代码] SailingEase .NET Resources Tool (.NET 多语言资源编辑器)

    我在2016年10月发过一篇博客,介绍了我写过的一个多语言资源文件编辑器,并且做为免费软件发布给了出来. 陆续收到了一些朋友的反馈,有朋友很热心提了很多建议和关心的话,还有朋友发红包过来,让我很感动. ...

  6. ubuntu无法进入桌面的修复

    今天的kubuntu更新后停在了启动logo上,无法进入系统界面了. 先在网上找了找,搜到了一个看起来很像的. 1)ubuntu在系统启动logo过后无法进入桌面的处理方法 一般情况下,无法显示桌面, ...

  7. js在新页面中返回到上一页浏览的历史位置

    在微信浏览器中浏览页面时,在当前页面中当我们将页面往下滚动到某一个位置时,可能我们就会点击某个链接而页面跳转到了另外一个页面,而当我们又返回到上一个页面时我们会发现那个页面还停留在我们之前浏览的位置, ...

  8. Spring中LocalSessionFactoryBean与SessionFactory

    相信不少人多纠结LocalSessionFactoryBean与SessionFactory到底是什么关系,怎么去进行关联的,正如图所示: transactonManager有一个对sessionFa ...

  9. angularjs购物车效果

    用angularjs写了一个购物车效果中. html代码: <div png-app="myAp" ng-controller="conTroll"> ...

  10. MS office2010 ppt自动放映的设置方法

    在菜单“幻灯片放映”-“排练时间”,进入演示,然后设置每张幻灯片需要等待的时间后,手动切换到下一张(如图),一直放映结束,会提示你是否保存排练时间.然后在菜单“幻灯片放映”-“设置放映方式”,里面选择 ...