【Trie+DP】BZOJ1212-[HNOI2004]L语言
【题目大意】
给出字典和文章,求出文章能够被理解的最长前缀。
【思路】
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语言的更多相关文章
- 【Trie】bzoj1212 [HNOI2004]L语言
枚举每个文章里已经在Trie中被标记为可能是分割处的字符,然后再从此处跑Trie,继续向后标记.由于单词数很少,因此复杂度可以接受,O(n*m*Len). #include<cstdio> ...
- bzoj1212: [HNOI2004]L语言(字典树)
1212: [HNOI2004]L语言 题目:传送门 题解: 看完题目之后就觉得可以暴力在字典树上之间询问,一开始还傻了以为用文章来建,肯定用单词啊: 那么我们可以用一个v数组表示当前字符串1~i的区 ...
- [bzoj1212][HNOI2004]L语言_AC自动机_动态规划
L语言 bzoj-1212 HNOI-2004 题目大意:给你一个n个单词的集合,然后给你m条字符串.问每条字符串可以被理解的最长前缀.被理解当且仅当存在一种分割使得每一段都是集合里的元素. 注释:$ ...
- BZOJ1212[HNOI2004]L语言——trie树+DP
题目描述 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章T是由若干小写字母构成.一个单词W也是由若干小写字母构成.一个字典D是若干个单词的 ...
- BZOJ1212: [HNOI2004]L语言(Trie图+DP)
Description 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章T是由若干小写字母构成.一个单词W也是由若干小写字母构成.一个字典D ...
- [BZOJ1212][HNOI2004]L语言
BZOJ Luogu sol 设\(f_i\)表示文章的前\(i\)个字符是否可以被理解.每次匹配要暴跳\(fail\)到根,转移就是\(f_i|=f_{i-len}\),其中\(len\)是某个可以 ...
- 【BZOJ1212】[HNOI2004]L语言 Trie树
[BZOJ1212][HNOI2004]L语言 Description 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章T是由若干小写字母构 ...
- BZOJ 1212: [HNOI2004]L语言( dp + trie )
因为单词很短...用trie然后每次dp暴力查找...用哈希+dp应该也是可以的.... ------------------------------------------------------- ...
- 洛谷:P2292 [HNOI2004]L语言(DP+Trie树)
P2292 [HNOI2004]L语言 题目链接:https://www.luogu.org/problemnew/show/P2292 题目描述 标点符号的出现晚于文字的出现,所以以前的语言都是没有 ...
随机推荐
- gogole调试请求体的数据怎么知道
在network---->header->request payload中看 详细情况见下图所示:
- elementUi 组件--el-table
[需求]在element中,将表格中的数据进行处理,然后渲染出来.例如,将数据保留小数点后两位显示. [知识点]formatter:用来格式化内容 [分析]在element 的table中,实现的过程 ...
- jsonp解析 html
https://jsoup.org/cookbook/ 官网的教程, 很详细! <dependency> <groupId>org.jsoup</groupId> ...
- 知问前端——按钮UI
按钮(button),可以给生硬的原生按钮或者文本提供更多丰富多彩的外观.它不单单可以设置按钮或文本,还可以设置单选按钮和多选按钮. 使用button按钮 使用button按钮UI的时候,不一定必须是 ...
- bzoj1577 [Usaco2009 Feb]庙会捷运Fair Shuttle
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1577 [题解] 我们把每坨奶牛按s排个序. 对于每坨奶牛,如果车上有空位置就塞. 否则,看下 ...
- 1210笔记//关于导航实例-QQ空间//导航实例-storyboard实现//控制器的生命周期//控制器的生命周期方法
一.利用storyboard完成导航1.storyboard中用来跳转的每一根线 都是 一个 UIStoryboardSegue对象1> 自动跳转 (从 某个按钮 拖线到 下一个目的控制器) ...
- 【洛谷 P1437】 [HNOI2004]敲砖块 (DP)
题目链接 毒瘤DP题 因为\((i,j)\)能不能敲取决于\((i-1,j)\)和\((i-1,j+1)\),所以一行一行地转移显然是有后效性的. 于是考虑从列入手.我们把这个三角形"左对齐 ...
- bzoj 1041 数学推理
原题传送门http://www.lydsy.com/JudgeOnline/problem.php?id=1041 我们只需要求第一象限内(不包括坐标轴)的点数然后ans=ans*4+4就好了 首先我 ...
- ie6浏览器兼容性
1.ie6双倍边距bug 块状元素设置float(左浮动或有浮动),并且设置margin值之后,第一个浮动的元素其左侧margin值为正常的2倍,如图,可以看到第一个元素的左侧边距于其他元素两两之间的 ...
- selenium.common.exceptions.WebDriverException: Message: 'geckodriver' executable needs to be in PATH.
http://www.seleniumhq.org/download 1. selenium 3.x开始,webdriver/firefox/webdriver.py的__init__中,exec ...