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:呵呵呵好吧我也是醉了)
  1. type
  2. point=^node;
  3. node=record
  4. st:ansistring;
  5. ex:longint;
  6. jump,fat:point;
  7. next:array['A'..'Z'] of point;
  8. end;
  9. var
  10. i,j,k,l,m,n:longint;
  11. head,p1,p2:point;
  12. s1:ansistring;
  13. a:array[..] of longint;
  14. function getpoint:point;
  15. var p1:point;c1:char;
  16. begin
  17. new(p1);
  18. p1^.ex:=;
  19. p1^.st:='';
  20. p1^.fat:=nil;
  21. p1^.jump:=head;
  22. for c1:='A' to 'Z' do p1^.next[c1]:=nil;
  23. getpoint:=p1;
  24. end;
  25. procedure ins(s1:ansistring);
  26. var
  27. s2:ansistring;
  28. i,j,k,l:longint;
  29. p1,p2:point;
  30. begin
  31. p1:=head;s2:='';
  32. for i:= to length(s1) do
  33. begin
  34. s2:=s2+s1[i];
  35. if p1^.next[s1[i]]=nil then
  36. begin
  37. p2:=getpoint;
  38. p2^.st:=s2;
  39. p2^.fat:=p1;
  40. p1^.next[s1[i]]:=p2;;
  41. end;
  42. p1:=p1^.next[s1[i]];
  43. if i=length(s1) then p1^.ex:=;
  44. end;
  45. end;
  46. procedure linkit;
  47. var
  48. i,j,k,l,f,r:longint;
  49. p1,p2:point; c1:char;
  50. d:array[..] of point;
  51. begin
  52. f:=;r:=;
  53. d[]:=head;
  54. while f<r do
  55. begin
  56. for c1:='A' to 'Z' do
  57. begin
  58. if d[f]^.next[c1]<>nil then
  59. begin
  60. d[r]:=d[f]^.next[c1];
  61. if (d[f]<>head) then
  62. begin
  63. p2:=d[f]^.jump;
  64. while (p2^.next[c1]=nil) and (p2<>head) do p2:=p2^.jump;
  65. if p2^.next[c1]<>nil then d[r]^.jump:=p2^.next[c1];
  66. end;
  67. inc(r);
  68. end;
  69. end;
  70. inc(f);
  71. end;
  72. end;
  73. function cal(s1:ansistring):longint;
  74. var
  75. i,j,k,l:longint;
  76. p1,p2:point;
  77. begin
  78. p1:=head;l:=;
  79. fillchar(a,sizeof(a),);
  80. a[]:=;
  81. for i:= to length(s1) do
  82. begin
  83. if p1^.next[s1[i]]=nil then
  84. begin
  85. while (p1^.next[s1[i]]=nil) and (p1<>head) do p1:=p1^.jump;
  86. if p1^.next[s1[i]]<>nil then p1:=p1^.next[s1[i]]
  87. end
  88. else p1:=p1^.next[s1[i]];
  89. p2:=p1;
  90. while p2<>head do
  91. begin
  92. if (p2^.ex=) and (a[i-length(p2^.st)]=) then
  93. begin
  94. a[i]:=;
  95. l:=i;break;
  96. end;
  97. p2:=p2^.jump;
  98. end;
  99. end;
  100. exit(l);
  101. end;
  102.  
  103. begin
  104. readln(n,m);head:=getpoint;
  105. head^.jump:=head;
  106. for i:= to n do
  107. begin
  108. readln(s1);
  109. ins(upcase(s1));
  110. end;
  111. linkit;
  112. for i:= to m do
  113. begin
  114. readln(s1);
  115. writeln(cal(upcase(s1)));
  116. end;
  117. readln;
  118. 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. Varnish+Xcache构建高性能WEB构架初探

    本文主要讲述web优化方案和缓存工具的调研及使用.根据目前的测试结果来看,采用varnish+xcache作为 apache和 php缓存这种架构具有高并发.高稳定性,易扩展等优点,服务器的动态请求处 ...

  2. CentOS 6一键系统优化 Shell 脚本

    CentOS 6一键系统优化 Shell 脚本 脚本的内容如下: #!/bin/bash#author suzezhi#this script is only for CentOS 6#check t ...

  3. Hibernate核心配置文件

    Hibernate.cfg.xml是Hibernate操作数据库的核心配置文件 *********************************************** 作用 01.管理实体类的 ...

  4. Unity3d Hololens MR开发入门

    一.Hololens概述 Hololens有以下特性 1.空间映射借助微软特殊定制的全息处理单元(HPU),HoloLens 实现了对周边环境的快速扫描和空间匹配.这保证了 HoloLens能够准确地 ...

  5. 《JAVASCRIPT高级程序设计》第一章

    在使用调制解调器的时代,频繁的表单验证对客户端来说是一个很大的负担,javascript,作为一种专门进行表单验证的客户端脚本语言诞生了.到今天,javascript早已超越了当初设定的角色.Java ...

  6. java_XML_DOM1

    一.Java DOM 的 API: 1.解析器工厂类:DocumentBuilderFactory 创建的方法:DocumentBuilderFactory dbf = DocumentBuilder ...

  7. 一个web应用的诞生--数据存储

    上一章实现了登录的部分功能,之所以说是部分功能,是因为用户名和密码写成固定值肯定是不可以的,一个整体的功能,至少需要注册,登录,密码修改等,这就需要提供一个把这些值存储到数据库的能力. 当前的主流数据 ...

  8. Android Studio 错误集

    错误列表与解决方案: 1.Android studio Gradle project sync failed Android studio 构建项目出错 Error:Unable to start t ...

  9. winform连接oracle时Oracle.DataAccess.dll版本问题

    1.通用TestOracle.zip部署到iis上,或直接运行程序测试当前全局程序集 protected void Button1_Click(object sender, EventArgs e) ...

  10. c#访问数据库的两种方法以及事务的两种方法

    //2015/07/03 using System; using System.Collections.Generic; using System.Linq; using System.Text; u ...