【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 题目描述 标点符号的出现晚于文字的出现,所以以前的语言都是没有 ...
随机推荐
- HDU4280:Island Transport(最大流)
Island Transport Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- c++ 公有继承的赋值兼容规则
赋值兼容规则是指在需要基类对象的任何地方都可以使用公有派生类的对象来替代.通过公有继承,派生类得到了基类中除构造函数.析构函数之外的所有成员,而且所有成员的访问控制属性也和基类完全相同.这样,公有派生 ...
- BootStrap弹出框插件popover简单实例
1.网上实例地址 http://www.runoob.com/bootstrap/bootstrap-popover-plugin.html 2.具体demo $("#pieId&q ...
- SCC模板
vector<int> G[maxn]; int pre[maxn], low[maxn], c[maxn]; int n, m; stack<int> s; int dfst ...
- Dokuwiki 二次开发记录
Dokuwiki 二次开发记录 [转]http://www.syyong.com/other/Dokuwiki-Secondary-Development-Record.html DokuWiki 是 ...
- 【Foreign】树 [prufer编码][DP]
树 Time Limit: 10 Sec Memory Limit: 256 MB Description Input Output Sample Input 3 2 2 1 Sample Outp ...
- 最短路算法详解(Dijkstra,Floyd)
最短路径 在一个无权的图中,若从一个顶点到另一个顶点存在着一条路径,则称该路径长度为该路径上所经过的边的数目,它等于该路径上的顶点数减1.由于从一个顶点到另一个顶点可能存在着多条路径,每条路径上所经过 ...
- HDU1024(最大M子段和)
Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- Linux进程的Uninterruptible sleep(D)状态【转】
转自:http://c20031776.blog.163.com/blog/static/68471625201121522824111/ 运行在KVM虚拟机里的一些进程突然出了问题,这些出了问题的进 ...
- .tar与.gz有什么联系与区别?
我们在windows下经常进行压缩解压等操作.在linux上也经常会用到,但是比较常见的是.tar.gz 很多人见到就条件反射,压缩用czvf,解压用xzvf.但是,你真的了解这个后缀名吗? 其实: ...