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 [题目描述] ...
随机推荐
- spring mvc 必须传某个参数的写法
在controller中写 @RequestMapping(中的params="json") @RequestMapping(value = "/{username}&q ...
- 新版本chrome浏览器控制台怎么设置成独立的窗口
新版本chrome浏览器控制台怎么设置成独立的窗口: 就是你要切换控制台在底部和右侧的那个按钮,然后长按
- Oracle中 Instr 这个函数
http://www.jb51.net/article/42369.htm sql :charindex('字符串',字段)>0 charindex('administrator',MUserI ...
- SVG在网页中的四种使用方式
1,直接打开simple.svg <svg xmlns="http://www.w3.org/2000/svg" width="200" height=& ...
- php之 有点复杂的 流程管理
1.流程管理的用法是什么样的? 2.怎么发起想要的流程? 3.审批的人要是怎么审批通过? 4.流程审核是不是要挨个走过? 一.还是要有数据库的内容的 肯定会有表的,首先就是用户表了,然后就是流程表,用 ...
- 定时任务管理中心(dubbo+spring)-我们到底能走多远系列47
我们到底能走多远系列47 扯淡: 又是一年新年时,不知道上一年你付出了多少,收获了多少呢?也许你正想着老板会发多少奖金,也许你正想着明年去哪家公司投靠. 这个时间点好好整理一下,思考总结一下,的确是个 ...
- 无限“递归”的python程序
如果一个函数直接或者间接调用了自己,那么就形成了递归(recursion),比如斐波那契数列的一个实现 def fib(n): if n <= 2: return 1 else: return ...
- 微信前端面试题----js实现LazyMan
这是微信小程序的一道面试题,题目是这样的: 实现一个LazyMan,可以按照以下方式调用:LazyMan("Hank")输出:Hi! This is Hank! LazyMan(& ...
- iOS核心笔记—MapKit框架-基础
1.MapKit框架简介: ✨了解:MapKit框架使用须知:①.MapKit框架中所有的数据类型的前缀都是MK:②.需要导入#import <MapKit/MapKit.h>头文件:③. ...
- Spring Boot 基础教程系列学习文档
Spring Boot基础教程1-Spring Tool Suite工具的安装 Spring Boot基础教程2-RESTfull API简单项目的快速搭建 Spring Boot基础教程3-配置文件 ...