【题目大意】
给出字典和文章,求出文章能够被理解的最长前缀。

【思路】

1A……!先用文章建立一棵Trie树,然后对于文章进行DP。f[i]表示文章中长度为i的前缀能否被理解,如果f[i]能理解,顺着下一个字母开始暴力走一遍字典树,递推下去。最后输出最大的满足f[i]=1的i即可。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
using namespace std;
const int MAXN=(<<)+;
const int maxlen=;
struct Trie
{
Trie* next[];
int avail;
int dep;
Trie()
{
for (int i=;i<;i++) next[i]=NULL;
avail=;
dep=;
}
};
int n,m,f;
Trie* rt; void insert(Trie* rt,char* str)
{
int len=strlen(str);
Trie* now=rt;
for (int i=;i<len;i++)
{
int index=str[i]-'a';
if (now->next[index]==NULL)
{
now->next[index]=new Trie;
now->next[index]->dep=now->dep+;
}
now=now->next[index];
}
now->avail=;
} int dp(Trie* rt,char* str)
{
int f[MAXN];
int len=strlen(str),ans;
memset(f,,sizeof(f));
for (int i=;i<=len;i++)
{
if (f[i] || i==)
{
ans=i;
Trie* now=rt;
for (int j=i;j<=i+maxlen-;j++)
{
if (str[j]>'z' || str[j]<'a') break;
int index=str[j]-'a';
if (now->next[index]==NULL) break;
now=now->next[index];
if (now->avail) f[i+now->dep]=;
}
}
}
return ans;
} void init()
{
rt=new Trie;
scanf("%d%d",&n,&m);
for (int i=;i<n;i++)
{
char str[];
scanf("%s",str);
insert(rt,str);
}
} void get_ans()
{
for (int i=;i<m;i++)
{
char str[MAXN];
scanf("%s",str);
cout<<dp(rt,str)<<endl;
}
} int main()
{
init();
get_ans();
return ;
}

【Trie+DP】BZOJ1212-[HNOI2004]L语言的更多相关文章

  1. 【Trie】bzoj1212 [HNOI2004]L语言

    枚举每个文章里已经在Trie中被标记为可能是分割处的字符,然后再从此处跑Trie,继续向后标记.由于单词数很少,因此复杂度可以接受,O(n*m*Len). #include<cstdio> ...

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

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

  3. [bzoj1212][HNOI2004]L语言_AC自动机_动态规划

    L语言 bzoj-1212 HNOI-2004 题目大意:给你一个n个单词的集合,然后给你m条字符串.问每条字符串可以被理解的最长前缀.被理解当且仅当存在一种分割使得每一段都是集合里的元素. 注释:$ ...

  4. BZOJ1212[HNOI2004]L语言——trie树+DP

    题目描述 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章T是由若干小写字母构成.一个单词W也是由若干小写字母构成.一个字典D是若干个单词的 ...

  5. BZOJ1212: [HNOI2004]L语言(Trie图+DP)

    Description 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章T是由若干小写字母构成.一个单词W也是由若干小写字母构成.一个字典D ...

  6. [BZOJ1212][HNOI2004]L语言

    BZOJ Luogu sol 设\(f_i\)表示文章的前\(i\)个字符是否可以被理解.每次匹配要暴跳\(fail\)到根,转移就是\(f_i|=f_{i-len}\),其中\(len\)是某个可以 ...

  7. 【BZOJ1212】[HNOI2004]L语言 Trie树

    [BZOJ1212][HNOI2004]L语言 Description 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章T是由若干小写字母构 ...

  8. BZOJ 1212: [HNOI2004]L语言( dp + trie )

    因为单词很短...用trie然后每次dp暴力查找...用哈希+dp应该也是可以的.... ------------------------------------------------------- ...

  9. 洛谷:P2292 [HNOI2004]L语言(DP+Trie树)

    P2292 [HNOI2004]L语言 题目链接:https://www.luogu.org/problemnew/show/P2292 题目描述 标点符号的出现晚于文字的出现,所以以前的语言都是没有 ...

随机推荐

  1. Fragmenttabhost的使用教程

    1.准备tab的图标,放到mipmap目录下面,大小64x64,准备2种,一种是选中的,一种是未选中的,如下图 2.重写fragmentabhost,防止调用fragment每次点击tab都要重新调用 ...

  2. wget命令下载FTP整个目录进行文件备份

    使用wget下载整个FTP目录,可以用于服务器间文件传输,进行远程备份.通过限制网速,可以解决带宽限制问题. #wget ftp://IP:PORT/* --ftp-user=xxx --ftp-pa ...

  3. java 保护内存操作的方法

    1.与c++不同,在java中,没有通过使用强制转换指针类型或者通过进行指针运算直接访问内存的方法.在java中使用对象时,需要严格地遵守类型规则.如果存在一个Mountain类对象的引用(类似于c+ ...

  4. js 读写文件

    读写文件: var f = fso.CreateTextFile("c:\\pexam\\"+name+".txt", true); f.write(arr); ...

  5. Java并发(9)- 从同步容器到并发容器

    引言 容器是Java基础类库中使用频率最高的一部分,Java集合包中提供了大量的容器类来帮组我们简化开发,我前面的文章中对Java集合包中的关键容器进行过一个系列的分析,但这些集合类都是非线程安全的, ...

  6. c# vs2008报表

    1. 做报表没做几次,第一次做的都忘记了,还好今天做一下就把报表弄成功了.报表中“参数字段”是可以变的,就是说需要自己赋值或者是要计算的.而在苏据库字段里面的是固定的值.不需要计算(注:有的字段查询出 ...

  7. React事件处理程序

    function ActionLink() { function handleClick(e) { e.preventDefault(); console.log('The link was clic ...

  8. Apache服务器

    Apache服务器 一  简介 1   www:world  wide  web    万维网 http    协议:  超文本传输协议 HTML语言:  超文本标识语言 2   URL:统一资源定位 ...

  9. 常见的makefile写法【转】

    转自:http://blog.csdn.net/ghostyu/article/details/7755177 版权声明:本文为博主原创文章,未经博主允许不得转载. .目标名称,摆脱手动设置目标名称 ...

  10. POJ3264(线段树求区间最大最小值)

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 41162   Accepted: 19327 ...