1212: [HNOI2004]L语言
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
is
name
what
your
whatisyourname
whatisyouname
whaisyourname
Sample Output
6
0 整段文章’whatisyourname’都能被理解
前缀’whatis’能够被理解
没有任何前缀能够被理解
HINT
Source
- 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语言的更多相关文章
- 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自动机 + 背包】
题目链接[http://www.lydsy.com/JudgeOnline/problem.php?id=1212] 题意:给你一些单词,然后给出一个没有标点的文本串S,都是小写字符.现在让你求用给出 ...
- 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语言 trie
长度小于 10 是关键信息~ #include <cstdio> #include <cstring> #include <algorithm> #define N ...
- bzoj1212: [HNOI2004]L语言(字典树)
1212: [HNOI2004]L语言 题目:传送门 题解: 看完题目之后就觉得可以暴力在字典树上之间询问,一开始还傻了以为用文章来建,肯定用单词啊: 那么我们可以用一个v数组表示当前字符串1~i的区 ...
- 洛谷(cogs 1293/bzoj 1212) P2292 [HNOI2004]L语言
1293. [HNOI2004] L语言 ★★★ 输入文件:language.in 输出文件:language.out 简单对比时间限制:1 s 内存限制:162 MB [题目描述] ...
随机推荐
- Varnish+Xcache构建高性能WEB构架初探
本文主要讲述web优化方案和缓存工具的调研及使用.根据目前的测试结果来看,采用varnish+xcache作为 apache和 php缓存这种架构具有高并发.高稳定性,易扩展等优点,服务器的动态请求处 ...
- CentOS 6一键系统优化 Shell 脚本
CentOS 6一键系统优化 Shell 脚本 脚本的内容如下: #!/bin/bash#author suzezhi#this script is only for CentOS 6#check t ...
- Hibernate核心配置文件
Hibernate.cfg.xml是Hibernate操作数据库的核心配置文件 *********************************************** 作用 01.管理实体类的 ...
- Unity3d Hololens MR开发入门
一.Hololens概述 Hololens有以下特性 1.空间映射借助微软特殊定制的全息处理单元(HPU),HoloLens 实现了对周边环境的快速扫描和空间匹配.这保证了 HoloLens能够准确地 ...
- 《JAVASCRIPT高级程序设计》第一章
在使用调制解调器的时代,频繁的表单验证对客户端来说是一个很大的负担,javascript,作为一种专门进行表单验证的客户端脚本语言诞生了.到今天,javascript早已超越了当初设定的角色.Java ...
- java_XML_DOM1
一.Java DOM 的 API: 1.解析器工厂类:DocumentBuilderFactory 创建的方法:DocumentBuilderFactory dbf = DocumentBuilder ...
- 一个web应用的诞生--数据存储
上一章实现了登录的部分功能,之所以说是部分功能,是因为用户名和密码写成固定值肯定是不可以的,一个整体的功能,至少需要注册,登录,密码修改等,这就需要提供一个把这些值存储到数据库的能力. 当前的主流数据 ...
- Android Studio 错误集
错误列表与解决方案: 1.Android studio Gradle project sync failed Android studio 构建项目出错 Error:Unable to start t ...
- winform连接oracle时Oracle.DataAccess.dll版本问题
1.通用TestOracle.zip部署到iis上,或直接运行程序测试当前全局程序集 protected void Button1_Click(object sender, EventArgs e) ...
- c#访问数据库的两种方法以及事务的两种方法
//2015/07/03 using System; using System.Collections.Generic; using System.Linq; using System.Text; u ...