tire水题,%Menci

原题:

标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的。现在你要处理的就是一段没有标点的文章。
一段文章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下能够被理解的最长前缀的位置。

1<=n, m<=20,每个单词长度不超过10,每段文章长度不超过1M

说了是水题了,直接建个tire,用f[i]表示一直到前i个都可以理解,如果r[i]=true,就从i开始匹配,假设到j匹配到一个单词,呢么f[j]=true

问的是最长前缀,所以如果f[j]==true,ans=max(ans,f[j])

刚开始看错题了,还以为是问那个串能看懂,不过就算问这个也能做,直接输出f[len-1]即可

第一眼看题还以为是AC自动机,看了Menci题解才想到tire,也许AC自动机也能做?(我太弱了想不出来)

话说Menci直接调用f[-1]真的好么……

代码:

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int n,m;
char s[]; int sl;
bool f[];
struct ddd{int num,next[];}tire[]; int ttop=;
void insert(int x,int y){
int ch=s[y]-'a';
if(!tire[x].next[ch]){ tire[x].next[ch]=++ttop; tire[ttop].num=;}
if(y==sl-){ tire[tire[x].next[ch]].num++; return ;}
insert(tire[x].next[ch],y+);
}
int main(){//freopen("ddd.in","r",stdin);
cin>>n>>m;
while(n --> ){//趋向于
scanf("%s",s); sl=strlen(s);
insert(,);
}
while(m --> ){//趋向于
scanf("%s",s); sl=strlen(s);
memset(f,,sizeof(f)); f[-]=true;
int ans=-;
for(int i=;i<sl;i++)if(f[i-]){
int temp=,ch;
for(int j=i;j<sl;j++){
ch=s[j]-'a';
if(!tire[temp].next[ch]) break;
temp=tire[temp].next[ch];
if(tire[temp].num){ f[j]=true; ans=max(ans,j);}
}
}
cout<<ans+<<endl;
}
return ;
}

【HNOI2004】【P1365】L语言的更多相关文章

  1. [HNOI2004]Language L语言

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

  2. 【HNOI2004】L语言

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

  3. [HNOI2004][bzoj1212] L语言 [Trie+dp]

    题面 传送门 思路 无后效性 显然,不管某个前缀的理解方式是怎么样的,如果它能被理解,那么前面的决策对于后面的决策而言都是等价的 因此这题可以DP DP方程 令$dp[i]$表示前缀i是否能被理解 那 ...

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

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

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

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

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

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

  7. 1212: [HNOI2004]L语言

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

  8. BZOJ_1212_[HNOI2004]L语言_哈希

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

  9. 洛谷 P2292 [HNOI2004] L语言 解题报告

    P2292 [HNOI2004] L语言 题目描述 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章\(T\)是由若干小写字母构成.一个单词 ...

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

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

随机推荐

  1. c#读取文本文档实践1-File.ReadAllLines()

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...

  2. Map的遍历

    @Test public void test() { Map<String,String> usersmap = new HashMap<>(); usersmap.put(& ...

  3. Oracle数据库DECODE函数的使用.

    decode函数是Oracle数据库独有的. 语法为: decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 例子:select decode(sign(变量1-变量2) ...

  4. 2016 - 1- 22 HTTP(三)

    一: iOS中发送HTTP请求的方案 三: HTTP通信过程  1.请求 1.1 HTTP协议规定,一个完整的有客户端发给服务器的请求应包含以下内容: 1.1.1 请求头: 包含了对客户端环境的描述与 ...

  5. Python命名规范

    Python 标识符 参见:https://docs.python.org/3/reference/lexical_analysis.html?highlight=identifier#identif ...

  6. D - Mysterious Present

    这个题和求最长递增序列的题类似,为了能输出一组可行的数据,我还用了一点儿链表的知识. Description Peter decided to wish happy birthday to his f ...

  7. PHP_string

    \n 换行 \r 回车 \t 制表符 \$ 美元符 \0 八进制数 \x 十六进制数 \\ 反斜杠字符

  8. .NET概念:.NET程序编译和运行

    .NET概念:.NET程序编译和运行 分类: c#程序设计 2012-02-29 15:46 3001人阅读 评论(2) 收藏 举报 .net编译器语言microsoftassemblyvb.net ...

  9. C++学习笔记6:多文件编程

    1.添加文件到工程中: 2.函数调用时需要前向声明;以下为实例: //add.cpp int add(int x, int y) { return (x + y); } //main.cpp #inc ...

  10. js实现对比百分比

    <script> for(var i=1;i<=3;i++){ for(var j=2;j<=4;j++){ var hid="w_"+4+j+" ...