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 [题目描述] ...
随机推荐
- c 语言冒泡排序
重要的不是代码 而是思想思路 #include<stdio.h> void Print(int *num, int n) { int i; for(i = 0; i < ...
- linux下的Source命令的基本功能
source命令用法:source FileName作用:在当前bash环境下读取并执行FileName中的命令.注:该命令通常用命令“.”来替代.如:source .bash_rc 与 . .bas ...
- Paxos 实现日志复制同步(Multi-Paxos)
Paxos 实现日志复制同步 这篇文章以一种易于理解的方式来解释 Multi-Paxos 的机制. Multi-Paxos 的是为了创建日志复制 一种实现方式是用一组基础 Paxos 实例,每条记录都 ...
- iOS 插件化开发汇总 Small框架
应用插件化背景 目前很多应用功能越来越多,软件显得越来越臃肿.因此插件化就成了很多软件发展的必经之路,比如支付宝这种平台级别的软件: 页上密密麻麻的功能,而且还在增多,照这个趋势发展下去,软件包的大小 ...
- 新手初学Redis之基础知识命令
笔者最初接触Redis是因为了解了一些nosql方面的知识,觉得nosql是一个很有意思的方面.像其中的mongodb,redis等等.当初也没有深入的去了解Redis,直到自己前段时间在写一个web ...
- ubuntu-16.04(linux)使用Reaver爆破wifi密码(路由器的WPS功能漏洞)
路由器的WPS功能 很多路由器都有WPS功能, 这边的WPS不是office工具软件, 而是路由器的一个功能: 路由器中WPS是由Wi-Fi联盟所推出的全新Wi-Fi安全防护设定(Wi-Fi Prot ...
- javascript 计算两个日期的差值
代码 Typescript版 /** * TimeSpan just like the class TimpSpan in C# ,represent the time difference * @c ...
- 基于python的互联网软件测试开发(自动化测试)-全集合
基于python的互联网软件测试开发(自动化测试)-全集合 1 关键字 为了便于搜索引擎收录本文,特别将本文的关键字给强调一下: python,互联网,自动化测试,测试开发,接口测试,服务测试,a ...
- iOS开发一些小技巧
1.隐藏多余的tableView的cell分割线 self.tableView.tableFooterView= [[UIViewalloc]init]; 2.取消系统自带的返回字样 [[UIBarB ...
- C# 添加、获取及删除PDF附件
C# 添加.获取及删除PDF附件 前言 附件在PDF文档中很常见,这些附件可以是PDF或其他类型的文件.在PDF中,附件有两种存在方式,一种是普通的文件附件(document-level file a ...