Link:

BZOJ 1212 传送门

Solution:

看到字符串的多模式匹配,正解一般就是Trie树/AC自动机

此题由于每个模式串长度都很小,于是直接在Trie树上暴力就行了

先把所有模式串建一颗Trie树,

用$DP[i]$表示能否匹配到第$i$个字符,如果能,则从第$i+1$位开始继续从根开始匹配,查看能否拓展答案

上述偏暴力的做法复杂度在$O(4*10^8)$左右,

好像还有一种用AC自动机+状压DP的做法能降到$O(10^6)$,后面再填吧

Code:

#include <bits/stdc++.h>

using namespace std;

const int MAXN=1e6+;
struct trie
{
int ch[];
bool flag;
}tr[]; int n,m,dp[MAXN],cnt=;
char s[MAXN]; int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) //建立Trie树
{
scanf("%s",s);
int cur=,len=strlen(s);
for(int j=;j<len;j++)
{
if(!tr[cur].ch[s[j]-'a']) tr[cur].ch[s[j]-'a']=++cnt;
cur=tr[cur].ch[s[j]-'a'];
}
tr[cur].flag=true;
}
for(int i=;i<=m;i++)
{
scanf("%s",s);memset(dp,,sizeof(dp));
int len=strlen(s);dp[]=;
for(int j=;j<len;j++)
{
if(!dp[j]) continue;
int cur=,k=j;
while(tr[cur].ch[s[k]-'a'])
{
cur=tr[cur].ch[s[k++]-'a'];
if(tr[cur].flag) dp[k]=;
}
}
for(int j=len;j>=;j--)
if(dp[j]){printf("%d\n",j);break;}
}
return ;
}

Review:

看到多模式匹配,往Trie+AC自动机上想就对了

[BZOJ 1212] L语言的更多相关文章

  1. BZOJ 1212 L语言(DP+字典树)

    求能被理解的最长前缀. 很显然的dp.令dp[i]=true,表示前缀i能理解.否则不能理解.那么dp[i+len]=dp[i]=true,当s[len]能匹配str[i,i+len]. 由于模式串长 ...

  2. BZOJ 1212: [HNOI2004]L语言 [AC自动机 DP]

    1212: [HNOI2004]L语言 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1367  Solved: 598[Submit][Status ...

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

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

  4. 洛谷(cogs 1293/bzoj 1212) P2292 [HNOI2004]L语言

    1293. [HNOI2004] L语言 ★★★   输入文件:language.in   输出文件:language.out   简单对比时间限制:1 s   内存限制:162 MB [题目描述] ...

  5. 1212: [HNOI2004]L语言

    1212: [HNOI2004]L语言 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 643  Solved: 252[Submit][Status] ...

  6. 【BZOJ1212】L语言(AC自动机)

    [BZOJ1212]L语言(AC自动机) 题面 BZOJ 题解 很自然的,既然要匹配单词,那就全部都丢到\(AC\)自动机里面去 现在想想怎么匹配 先是\(AC\)自动机正常的匹配 如果此时这个位置能 ...

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

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

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

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

  9. [HNOI2004]Language L语言

    2777: [HNOI2004]Language L语言 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 10  Solved: 5[Submit][S ...

随机推荐

  1. vue父组件中修改子组件样式

    1. 使用全局样式 <style> /* 全局样式 */ </style> <style scoped> /* 本地样式 */ </style> 2. ...

  2. 从零开始学习MXnet(二)之dataiter

    MXnet的设计结构是C++做后端运算,python.R等做前端来使用,这样既兼顾了效率,又让使用者方便了很多,完整的使用MXnet训练自己的数据集需要了解几个方面.今天我们先谈一谈Data iter ...

  3. bootstrap、angularJS、nodeJs、reactJs视频教程

    bootstrap.angularJS.nodeJs.reactJs视频教程 发布时间:『 2017-06-25 19:50』  博客类别:资源下载  阅读(74) 评论(0) 智能社与达内哪个好?说 ...

  4. white-space——处理元素内的空白

      定义和用法 white-space 属性设置如何处理元素内的空白.这个属性声明建立布局过程中如何处理元素中的空白符.值 pre-wrap 和 pre-line 是 CSS 2.1 中新增的. 默认 ...

  5. 51Nod-1586-约数和

    #include <cstdio> using namespace std; typedef long long ll; ; int n, q; int cnt[MAXN]; ll a[M ...

  6. Topcoder SRM 607 div1题解

    好久没来写了,继续继续... Easy(250pts): //前方请注意,样例中带有zyz,高能预警... 题目大意:给你一个字符串,中间有一些是未知字符,请你求出这个字符串的回文子串个数的期望值.数 ...

  7. 【spoj8222-Substrings】sam求子串出现次数

    http://acm.hust.edu.cn/vjudge/problem/28005 题意:给一个字符串S,令F(x)表示S的所有长度为x的子串中,出现次数的最大值.求F(1)..F(Length( ...

  8. [ CodeVS冲杯之路 ] P2952

    不充钱,你怎么AC? 题目:http://codevs.cn/problem/2952/ 题目讲一个细胞可分裂成 2 个,那么当前数目就是2a,a 为时间 然后 q 个细胞一起会死亡,也就是对 q 取 ...

  9. hdu 2899 Strange fuction (二分)

    题目链接:http://acm.hdu.edu.cn/showproblem.pihp?pid=2899 题目大意:找出满足F(x) = 6 * x^7+8*x^6+7*x^3+5*x^2-y*x ( ...

  10. 从setting文件导包

    两种方式 from project.settings.py import s3_key 第二种: from django.conf import setting s3_key = settings.S ...